2014-06-11 70 views
0

我看到人們這樣做:PHP OOP類鏈接

$controller->bar->stuff->foo(); 

我想這是CLASS鏈接?

這是如何實現的? (如果可以的話)

注意。我不是在問方法鏈。

乾杯!

編輯:忘了問這個......這對我有什麼好處?如果你們能寫一個簡短的例子,那會很棒!

+3

沒有所謂「類鏈」沒有這樣的事。 '$ controller'有一個屬性'bar';無論它在哪裏都有一個屬性「東西」;無論在哪裏*都有一個方法'foo';並且這個方法將被調用。 – Amadan

回答

4

這是通過可訪問的屬性來實現的。例如,使用public屬性...

class Stuff { 
    public function foo() {} 
} 

class Bar { 
    /** 
    * @var Stuff 
    */ 
    public $stuff; 

    public function ___construct(Stuff $stuff) { 
     $this->stuff = $stuff; 
    } 
} 

class Controller { 
    /** 
    * @var Bar 
    */ 
    public $bar; 

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

$stuff = new Stuff(); 
$bar = new Bar($stuff); 
$controller = new Controller($bar); 

$controller->bar->stuff->foo(); 

我不會推薦這個,因爲它讓你的類開放給外部修改。另一種方法可能是通過魔法吸氣方法,例如

class Controller { 
    private $properties = []; 

    public function __construct(Bar $bar) { 
     $this->properties['bar'] = $bar; 
    } 

    public function __get($name) { 
     return array_key_exists($name, $this->properties) 
      ? $this->properties[$name] : null; 
    } 
} 

這意味着你仍然可以沒有它開放給外部修改訪問屬性的專用$properties數組中,就像是一個公共屬性(例如$controller->bar) 。

在我看來,雖然,保持性能私人/保護,並提供訪問方法

class Controller { 
    /** 
    * @var Bar 
    */ 
    private $bar; 

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

    /** 
    * @return Bar 
    */ 
    public function getBar() { return $this->bar; } 
} 

$controller->getBar()->someBarMethod()->etc(); 
+0

感謝您的回答。我還有一個問題。不知道你是否曾經使用過CodeIgniter,但是...... CI有類似的東西 - $ this-> input-> post()...這是以同樣的方式實現的嗎? – user3713377

+2

我從未使用CI。如果你想知道,我建議你深入研究[源代碼](https://github.com/EllisLab/CodeIgniter/)。從我看到的情況來看,我當然不會把它作爲一個好的面向對象的燈塔。 – Phil

+0

+1爲了很好的解釋。只是一個側面的問題,第二塊代碼是否會更適合作爲註冊表對象? :) – Darren