我想做的是这样的事情:
$method_result = new Obj()->method();
Run Code Online (Sandbox Code Playgroud)
而不是必须做:
$obj = new Obj();
$method_result = $obj->method();
Run Code Online (Sandbox Code Playgroud)
在我的具体案例中,结果对我来说并不重要.但是,有没有办法做到这一点?
Del*_*tev 158
您要求的功能可从PHP 5.4获得.以下是PHP 5.4中的新功能列表:
http://php.net/manual/en/migration54.new-features.php
以及新功能列表中的相关部分:
已添加实例化的类成员访问权限,例如(new Foo) - > bar().
Pas*_*TIN 37
你不能做你所要求的; 但你可以"欺骗",因为在PHP中,你可以拥有一个与类同名的函数; 这些名字不会发生冲突.
所以,如果你声明了这样一个类:
class Test {
public function __construct($param) {
$this->_var = $param;
}
public function myMethod() {
return $this->_var * 2;
}
protected $_var;
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以声明一个返回该类实例的函数 - 并且该类与该类具有完全相同的名称:
function Test($param) {
return new Test($param);
}
Run Code Online (Sandbox Code Playgroud)
而现在,可以使用单行,就像你问的那样 - 只有你正在调用函数,因此不使用new:
$a = Test(10)->myMethod();
var_dump($a);
Run Code Online (Sandbox Code Playgroud)
它有效:在这里,我得到:
int 20
Run Code Online (Sandbox Code Playgroud)
作为输出.
而且,更好的是,你可以在你的函数上添加一些phpdoc:
/**
* @return Test
*/
function Test($param) {
return new Test($param);
}
Run Code Online (Sandbox Code Playgroud)
这样,您甚至可以在IDE中获得提示 - 至少使用Eclipse PDT 2.x; 看到screeshot:
http://extern.pascal-martin.fr/so/class-and-function.png
编辑2010-11-30:仅仅是为了获取信息,几天前提交了一个新的RFC,它建议将此功能添加到PHP的未来版本之一.
因此,在PHP 5.4或其他未来版本中可能会执行这样的操作:
(new foo())->bar()
(new $foo())->bar
(new $bar->y)->x
(new foo)[0]
Run Code Online (Sandbox Code Playgroud)
Jef*_*eff 19
怎么样:
$obj = new Obj(); $method_result = $obj->method(); // ?
Run Code Online (Sandbox Code Playgroud)
:P
Tom*_*rek 18
您可以通过定义标识函数来更普遍地执行此操作:
function identity($x) {
return $x;
}
identity(new Obj)->method();
Run Code Online (Sandbox Code Playgroud)
这样您就不需要为每个类定义一个函数.
Pim*_*ger 16
不,这是不可能的.
您需要先将实例分配给变量,然后才能调用其中的任何方法.
如果你真的不想这样做,你可以使用工厂作为ropstah建议:
class ObjFactory{
public static function newObj(){
return new Obj();
}
}
ObjFactory::newObj()->method();
Run Code Online (Sandbox Code Playgroud)
您可以使用静态工厂方法来生成对象:
ObjectFactory::NewObj()->method();
Run Code Online (Sandbox Code Playgroud)