如何进行多级解除引用?例如,在C#中,我们可以继续追加'。'访问下一个对象属性:string s, s.ToString(), s.ToString().ToUpper()
。使用PHP,我可以使用$this->someobject
,但$this->someobject->somethingelse
似乎不起作用。
有什么想法吗?
答案 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
解析为非对象(例如string
,float
,int
或array
),则无法进一步链接取消引用运算符
答案 2 :(得分:0)
您的语法正确,但仅适用于嵌套对象。通常,对象属性可能是数组类型,因此您需要相应地访问它:$this->somearray['somekey'];
如果您希望创建一个允许链接的流畅界面,则对象方法需要return $this;
才能实现此目的。
也可以使用::
(范围解析运算符)访问类,而无需实例化,但这有点超出了问题的范围。
希望有所帮助!