2009-07-07 33 views
6

xin lỗi vì chủ đề lạ đó nhưng tôi không biết cách thể hiện nó theo cách khác.Lớp PHP: truy cập vào cá thể gọi từ phương thức được gọi là

Tôi đang cố gắng truy cập một phương thức từ một lớp gọi điện. Giống như trong ví dụ này:

 
class normalClass { 
    public function someMethod() { 
      [...] 
      //this method shall access the doSomething method from superClass 
    } 
} 

class superClass { 
    public function __construct() { 
      $inst = new normalClass; 
      $inst->someMethod(); 
    } 
    public function doSomething() { 
      //this method shall be be accessed by domeMethod form normalClass 
    } 
} 

Cả hai lớp không liên quan đến kế thừa và tôi không muốn đặt chức năng thành tĩnh.

Có cách nào để đạt được điều đó không?

Cảm ơn sự giúp đỡ của bạn!

Trả lời

5

Bạn có thể vượt qua một tham chiếu đến đối tượng đầu tiên như thế này:

class normalClass { 
    protected $superObject; 
    public function __construct(superClass $obj) { 
     $this->superObject = $obj; 
    } 

    public function someMethod() { 
     //this method shall access the doSomething method from superClass 
     $this->superObject->doSomething(); 
    } 
} 

class superClass { 
    public function __construct() { 
      //provide normalClass with a reference to ourself 
      $inst = new normalClass($this); 
      $inst->someMethod(); 
    } 
    public function doSomething() { 
      //this method shall be be accessed by domeMethod form normalClass 
    } 
} 
1

Bạn có một vài lựa chọn. Bạn có thể sử dụng kết hợp như vậy

class normalClass 
{ 
    protected $superClass; 

    public function __construct(superClass $superClass) 
    { 
    $this->superClass = $superClass; 
    } 

    public function someMethod() 
    { 
    $this->superClass->doSomething(); 
    } 
} 

class superClass 
{ 
    public function __construct() 
    { 
    $inst = new normalClass($this); 
    $inst->someMethod(); 
    } 

    public function doSomething() 
    { //this method shall be be accessed by domeMethod form normalClass 
    } 
} 

Hoặc chỉ là một thẳng lên setter

class normalClass 
{ 
    protected $superClass; 

    public function setSuperClass(superClass $superClass) 
    { 
    $this->superClass = $superClass; 
    } 

    public function someMethod() 
    { 
    if (!isset($this->superClass)) 
    { 
     throw new Exception('you must set a superclass'); 
    } 
    $this->superClass->doSomething(); 
    } 
} 

class superClass 
{ 
    public function __construct() 
    { 
    $inst = new normalClass(); 
    $inst->setSuperClass($this); 
    $inst->someMethod(); 
    } 

    public function doSomething() 
    { //this method shall be be accessed by domeMethod form normalClass 
    } 
} 
0

Tùy thuộc vào trường hợp sử dụng của bạn, bạn có thể muốn vượt qua các ví dụ để chỉ chức năng:

class normalClass { 
    public function someMethod($object) { 
     $object->doSomething(); 
    } 
} 

Nếu normalClass::someMethod() có thể được gọi bằng nhiều, riêng biệt $object s, đây có thể là lựa chọn tốt hơn (thay vì cung cấp $object cho toàn bộ cá thể NormalClass).

Nhưng bất kể bạn có thể xem xét việc tạo ra một giao diện để sử dụng cho type hinting:

interface ISomethingDoer { 
    public function doSomething(); 
} 

class normalClass { 
    public function someMethod(ISomethingDoer $object) { 
     # Now PHP will generate an error if an $object is passed 
     # to this function which does not implement the above interface. 
     // ... 

class superClass implements ISomethingDoer { 
    // ... 
0

Bạn có thể sử dụng debug_backtrace() cho việc này. Đó là một chút iffy nhưng cho mục đích gỡ lỗi nó là hữu ích.

class normalClass { 
public function someMethod() { 
     $trace = debug_backtrace(); 
     $trace[1]->object->doSomething(); 
} 

}

+0

Bạn không nên sử dụng chức năng gỡ lỗi trong mã sản xuất – DarkNeuron

0

woah tôi đã cùng một vấn đề hơn bạn nhưng thay vì đi với đèo đơn giản như vậy tham chiếu đến đối tượng, tôi đi với một người quản lý sự kiện, Về cơ bản, khi một cái gì đó sẽ xảy ra trong lớp bình thường, nó sẽ kích hoạt một sự kiện được lắng nghe bởi một lớp và lớp đó nói (người nghe) sẽ gọi lớp siêu đó để thực hiện chức năng đó và nếu cần thiết vượt qua các đối số mới.

Dù sao, cho dù bạn chuyển nó như một tham số cho đối tượng của bạn hay bạn đi với một cách tiếp cận dựa trên sự kiện, cả hai giải pháp đều hoạt động. Chọn cái bạn thích.

Để biết thêm thông tin về các sự kiện, sympony giải thích nó khá tốt. http://symfony.com/doc/current/components/event_dispatcher/introduction.html

Các vấn đề liên quan