在PHP中,你能实例化一个对象并在同一行调用一个方法吗?

我想要做的是这样的:

$method_result = new Obj()->method(); 

而不是必须这样做:

 $obj = new Obj(); $method_result = $obj->method(); 

结果在我的具体情况中并不重要。 但是,有没有办法做到这一点?

您所要求的function可从PHP 5.4获得。 以下是PHP 5.4中的新function列表:

http://docs.php.net/manual/en/migration54.new-features.php

和新function列表中的相关部分:

实例化的类成员访问已被添加,例如(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); } 

现在,使用单线程就成为可能,就像你问的一样 – 只是你正在调用函数,因此不使用新的:

 $a = Test(10)->myMethod(); var_dump($a); 

它的工作原理:在这里,我得到:

 int 20 

作为输出。

而且,更好的是,你可以把一些phpdoc放在你的函数上:

 /** * @return Test */ function Test($param) { return new Test($param); } 

这样,您甚至可以在IDE中提示 – 至less在Eclipse PDT 2.x中; 看到screeshot:

so/class-and-function.png


编辑2010-11-30:仅供参考,几天前,一个新的RFC已经提交,build议将这个function添加到PHP的未来版本之一。

请参阅: 请求注释:实例和方法调用/属性访问

所以,也许在PHP 5.4或其他未来的版本中可以做这样的事情:

 (new foo())->bar() (new $foo())->bar (new $bar->y)->x (new foo)[0] 

你可以通过定义一个身份函数来更普遍的做到这一点:

 function identity($x) { return $x; } identity(new Obj)->method(); 

这样你就不需要为每个类定义一个函数。

怎么样:

 $obj = new Obj(); $method_result = $obj->method(); // ? 

:P

不,这是不可能的。
您需要先将实例分配给variables,然后才能调用它的任何方法。

如果你真的不想这样做,你可以像罗普斯塔那样使用一个工厂:

 class ObjFactory{ public static function newObj(){ return new Obj(); } } ObjFactory::newObj()->method(); 

您可以使用静态工厂方法来生成该对象:

 ObjectFactory::NewObj()->method(); 

我也正在寻找一个单线程来完成这个function,作为将date从一种格式转换为另一种格式的单一expression式的一部分。 我喜欢在一行代码中这样做,因为这是一个单一的逻辑操作。 所以,这是一个有点神秘,但它可以让你实例化和使用一个单一的行内的date对象:

 $newDateString = ($d = new DateTime('2011-08-30') ? $d->format('F d, Y') : ''); 

将datestring从一种格式转换为另一种格式的另一种方法是使用辅助函数来pipe理代码的OO部分:

 function convertDate($oldDateString,$newDateFormatString) { $d = new DateTime($oldDateString); return $d->format($newDateFormatString); } $myNewDate = convertDate($myOldDate,'F d, Y'); 

我认为面向对象的方法是很酷且必要的,但是有时可能会很乏味,需要太多的步骤来完成简单的操作。

我发现这个问题已经过时了,但是我认为这里应该提到:

称为“__call()”的特殊类方法可用于在类中创build新项目。 你这样使用它:

 <?php class test { function __call($func,$args) { echo "I am here - $func\n"; } } $a = new test(); $a->new( "My new class" ); ?> 

输出应该是:

 I am here - new 

因此,你可以欺骗PHP在你的顶级类(或者任何类的真正的类)内创build一个“新”命令,并把你的include命令放到__call()函数中,以包含你所要求的类。 当然,你可能想testing$ func以确保它是一个发送到__call()命令的“新”命令,(当然)也可以有其他命令,因为__call()是如何工作的。