我想做的是这样的事情:
$method_result = new Obj()->method();
而不是必须做:
$obj = new Obj(); $method_result = $obj->method();
在我的具体案例中,结果对我来说并不重要.但是,有没有办法做到这一点?
您要求的功能可从PHP 5.4获得.以下是PHP 5.4中的新功能列表:
http://php.net/manual/en/migration54.new-features.php
以及新功能列表中的相关部分:
已添加实例化的类成员访问权限,例如(new Foo) - > bar().
你不能做你所要求的; 但你可以"欺骗",因为在PHP中,你可以拥有一个与类同名的函数; 这些名字不会发生冲突.
所以,如果你声明了这样一个类:
class Test { public function __construct($param) { $this->_var = $param; } public function myMethod() { return $this->_var * 2; } protected $_var; }
然后,您可以声明一个返回该类实例的函数 - 并且该类与该类具有完全相同的名称:
function Test($param) { return new Test($param); }
而现在,可以使用单行,就像你问的那样 - 只有你正在调用函数,因此不使用new:
$a = Test(10)->myMethod(); var_dump($a);
它有效:在这里,我得到:
int 20
作为输出.
而且,更好的是,你可以在你的函数上添加一些phpdoc:
/** * @return Test */ function Test($param) { return new Test($param); }
这样,您甚至可以在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]
怎么样:
$obj = new Obj(); $method_result = $obj->method(); // ?
:P
您可以通过定义标识函数来更普遍地执行此操作:
function identity($x) { return $x; } identity(new Obj)->method();
这样您就不需要为每个类定义一个函数.
不,这是不可能的.
您需要先将实例分配给变量,然后才能调用其中的任何方法.
如果你真的不想这样做,你可以使用工厂作为ropstah建议:
class ObjFactory{ public static function newObj(){ return new Obj(); } } ObjFactory::newObj()->method();
您可以使用静态工厂方法来生成对象:
ObjectFactory::NewObj()->method();