为什么使用 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
对于 2024 年或以后发现这一点的人来说,PHP 8.4 将引入无需括号即可链接新实例的功能!请参阅RFC。