我看到人們這樣做:PHP OOP類鏈接
$controller->bar->stuff->foo();
我想這是CLASS鏈接?
這是如何實現的? (如果可以的話)
注意。我不是在問方法鏈。
乾杯!
編輯:忘了問這個......這對我有什麼好處?如果你們能寫一個簡短的例子,那會很棒!
我看到人們這樣做:PHP OOP類鏈接
$controller->bar->stuff->foo();
我想這是CLASS鏈接?
這是如何實現的? (如果可以的話)
注意。我不是在問方法鏈。
乾杯!
編輯:忘了問這個......這對我有什麼好處?如果你們能寫一個簡短的例子,那會很棒!
這是通過可訪問的屬性來實現的。例如,使用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();
感謝您的回答。我還有一個問題。不知道你是否曾經使用過CodeIgniter,但是...... CI有類似的東西 - $ this-> input-> post()...這是以同樣的方式實現的嗎? – user3713377
我從未使用CI。如果你想知道,我建議你深入研究[源代碼](https://github.com/EllisLab/CodeIgniter/)。從我看到的情況來看,我當然不會把它作爲一個好的面向對象的燈塔。 – Phil
+1爲了很好的解釋。只是一個側面的問題,第二塊代碼是否會更適合作爲註冊表對象? :) – Darren
沒有所謂「類鏈」沒有這樣的事。 '$ controller'有一個屬性'bar';無論它在哪裏都有一個屬性「東西」;無論在哪裏*都有一個方法'foo';並且這個方法將被調用。 – Amadan