我正在编写一些 PHP 代码并遇到了这一行,我不确定语法的含义。
$someclass = (new SomeClass())->someMethod(10);
这里发生了什么?我习惯于看到类被实例化,并且方法被这样调用:
$someclass = new SomeClass();
$someClass->someMethod(10);
我正在编写一些 PHP 代码并遇到了这一行,我不确定语法的含义。
$someclass = (new SomeClass())->someMethod(10);
这里发生了什么?我习惯于看到类被实例化,并且方法被这样调用:
$someclass = new SomeClass();
$someClass->someMethod(10);
该类已启动,但没有保留以后使用该类的参考。$someClass 将包含 someMethod(10) 返回的值。
这只是同一事物的简写符号。假设您需要调用bar
class 的方法Foo
。为此,您需要实例化Foo
:
$foo = new Foo;
$data = $foo->bar();
但你真的没有兴趣$foo
,你只是想要$data
。简写语法只是实例化类然后调用方法,而不需要创建和保留变量$foo
:
$data = (new Foo)->bar();
我认为你只能在 php >= 5.4 中做到这一点。
该类被实例化,然后someMethod
在新实例上调用。然后将someMethod
函数的结果存储到$someclass
. (顺便说一下,这个变量的标题具有误导性)
快速测试:
<?php
class SomeClass {
public function someMethod($val) {
return $val * 42;
}
}
$someclass = (new SomeClass())->someMethod(10);
var_dump($someclass);
输出:int(420)
new SomeClass()
返回指向类的新实例的指针。代码不是将其分配给变量,而是在新形成的实例中调用一个方法并返回该值。不保留新实例的句柄。如果它是 C++ 它会泄漏内存,但我很确定 PHP 会立即清理..
这与以下内容相同:
$object1 = new SomeClass();
$someclass = $object1->someMethod(10);
$someclass
应该是 的返回值someMethod
。实际值和类取决于如何someMethod
编写。
在某些实践中,someMethod
可能会返回对象实例本身。但这不是必须的。请someMethod
仔细阅读。