我见过人们这样做:
$controller->bar->stuff->foo();
我想这是CLASS链接?
这是如何实现的? (如果可以实现的话)
请注意。我不是在询问方法链。
干杯!
编辑:忘了问这个......这对我有什么好处?如果你们可以写一个简短的例子,它会很棒!答案 0 :(得分: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();
我不建议这样做,因为它让你的课程对外部修改开放。另一种方法可能是通过magic getter 方法,例如
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();