为什么使用new关键字的表达式需要括号才能在链式执行中使用?例如,在AS3中,您不需要使用括号。在PHP中,这是解释器的风格辅助,还是有更大的理由让我不知道?它是执行优先级问题的顺序吗?
使用PHP链接的构造函数
感谢这个问题Chaining a constructor with an object function call in 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();
答案 0 :(得分:8)
我相信这是因为解释器解析了这个,
new (Chihuahua('cake')->burp());
代替,
(new Chihuahua('cake'))->burp();
因为->
的优先级高于new
运算符。
因为这个而给你一个错误,
Chihuahua('cake')->burp()
不明白。希望它有所帮助。
答案 1 :(得分:4)
因为new
运算符的优先级低于->
运算符。 Php尝试在Chihuahua('cake')->burp()
之前运行new Chihuahua('cake')
。这就是问题所在。
答案 2 :(得分:1)
不确定为什么要尝试这样做,但有些事情要注意php。首先,是的,你需要在新的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");
答案 3 :(得分:0)
只是旁注:括号内的构造函数仅适用于PHP v 5.4及更高版本。 请参阅http://3v4l.org/ZANaO vs http://3v4l.org/m9vk9