为什么使用 new 关键字的表达式需要括号才能用于链式执行? 例如,在 AS3 中,您不需要括号。在 PHP 中,这是对解释器的一种风格帮助,还是有一个我不知道的更大的原因?是执行顺序问题吗?
PHP 中的构造函数链
感谢这个问题在 PHP 中使用对象函数调用链接构造函数我想出了如何......
对象定义
旁白:显然,神奇的方法
__construct
总是隐式返回$this
,如果您显式返回$this
(或与此相关的任何东西),则不会发生错误/警告/异常。
class Chihuahua
{
private $food;
function __construct( $food )
{
$this->food = $food;
}
function burp()
{
echo "$this->food burp!";
}
}
作品
(new Chihuahua('cake'))->burp();
不起作用(但我希望它起作用)
new Chihuahua('cake')->burp();
我相信这是因为解释器解析成这个,
new (Chihuahua('cake')->burp());
而不是,
(new Chihuahua('cake'))->burp();
因为
->
比new
运算符有更高的偏好。
给你一个错误,因为这个,
Chihuahua('cake')->burp()
不明白。希望对您有所帮助。
因为
new
运算符的优先级低于 ->
运算符。 Php 尝试在 Chihuahua('cake')->burp()
之前运行 new Chihuahua('cake')
。这就是问题所在。
不确定您为什么要尝试这样做,但是关于 php 需要注意一些事项。首先,是的,您需要在 new Object() 语句周围使用括号来内联转换对实际对象的调用。
在上面的示例中,您在调用 burp 方法后立即丢弃了对象。如果在这种情况下你需要一个对象方法来工作而不依赖于所述对象的实例,为什么不只使用静态方法呢?
编辑: 在 __complex 静态方法中添加以显示如何包装构造 -> 执行 -> 处理过程。
class Chihuahua
{
public static function burp( $food )
{
echo "$food burp!";
}
protected $food = '';
public function doBurp()
{
echo $this->food . " burp!";
}
public function __construct($food)
{
$this->food = $food;
}
public static __complex( $food )
{
$chi = new Chihuahua($food);
$chi->doBurp();
unset($chi);
}
}
Chihuahua::burp("cake");
// - or
Chihuahua::__complex("cake");
附带说明:括号内的构造函数仅适用于 PHP v 5.4 及更高版本。 请参阅http://3v4l.org/ZANaO 与http://3v4l.org/m9vk9