PHP多对象解引用

时间:2012-02-28 00:44:42

标签: php

如何进行多级解除引用?例如,在C#中,我们可以继续追加'。'访问下一个对象属性:string s, s.ToString(), s.ToString().ToUpper()。使用PHP,我可以使用$this->someobject,但$this->someobject->somethingelse似乎不起作用。

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

假设您正在使用PHP5+$this->someobject会返回一个名为somethingelse的对象;它应该工作。

同样,这也有效

class Example
{
    public function foo()
    {
        echo 'Hello';
        return $this; // returning an object (self)
    }

    public function bar()
    {
        echo ' World';
        return $this;
    }
}

$example = new Example;
$example->foo()->bar(); // Hello World
$example->foo()->foo()->foo()->bar()->foo(); // HelloHelloHello WorldHello

编辑:

另外请注意,您不必返回self。任何对象都足够了。

class Example1
{
    public function __construct(Example2 $example2)
    {
        $this->example2 = $example2;
        $this->example2->setExample1($this);
    }

    public function foo()
    {
        echo 'Hello';
        return $this->example2;
    }
}

class Example2
{
    public function setExample1(Example1 $example1)
    {
        $this->example1 = $example1;
    }

    public function bar()
    {
        echo ' World';
        return $this->example1;
    }
}

$example = new Example1(new Example2());
$example->foo()->bar(); // Hello World
$example->foo()->bar()->foo()->bar(); // Hello WorldHello World

答案 1 :(得分:3)

PHP的解除引用运算符仅适用于对象;并且,与其他语言不同,只有对象是对象;)基元没有隐式包装器。因此,如果$this->someobject解析为非对象(例如stringfloatintarray),则无法进一步链接取消引用运算符

答案 2 :(得分:0)

您的语法正确,但仅适用于嵌套对象。通常,对象属性可能是数组类型,因此您需要相应地访问它:$this->somearray['somekey'];

如果您希望创建一个允许链接的流畅界面,则对象方法需要return $this;才能实现此目的。

也可以使用::(范围解析运算符)访问类,而无需实例化,但这有点超出了问题的范围。

希望有所帮助!