PHP OOP CLASS链接

时间:2014-06-11 00:49:48

标签: php oop

我见过人们这样做:

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

我想这是CLASS链接?

这是如何实现的? (如果可以实现的话)

请注意。我不是在询问方法链。

干杯!

编辑:忘了问这个......这对我有什么好处?如果你们可以写一个简短的例子,它会很棒!

1 个答案:

答案 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();