在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:
编辑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()是如何工作的。