在PHP中进行对象实例化后立即使用对象操作符

时间:2010-12-18 17:15:33

标签: php oop

你不能做任何这些事情真的很烦人(而且你不能做任何事情):

new A('foo')->bar();

(new A('foo'))->bar();

我唯一能想到的是使用静态函数来返回一个新对象

public static function get($a) {
  return new self($a);
}
// ...
A::get('foo')->bar();

但那只是丑陋的。 我需要这个的原因是因为在对象定义的上下文中,我主要将新对象作为参数或作为数组的一部分传递:

new B(array(
   new A('foo')->bar()
   new A('smt')->bar()->more()
));

bar()more()当然会返回对象的引用。

3 个答案:

答案 0 :(得分:2)

这不是“如何在不使代码混乱的情况下执行此操作......”的答案,但希望在隧道尽头显示一些亮点。

最近有RFC这个特定话题(另见developer discussion),虽然有几点可以解决,但回应非常有利。

与此同时,无论你喜欢与否,你都必须坚持工厂。

答案 1 :(得分:2)

在PHP 5.4中,这已成为可能,因此无需解决方法:http://www.php.net/manual/en/migration54.new-features.php

  

PHP 5.4.0提供了广泛的新功能:

     

已添加实例化的类成员访问权限,例如(新Foo) - > bar()。

答案 2 :(得分:1)

不,据我所知,使用像你展示的功能是解决这个问题的唯一方法。

我在PHP的内部工作中不是大师,但建筑学的原因可能是new是一种语言构造,并且可以接受不同类型的表达。因此,

 new A('foo')->bar()

将是不明确的:新对象是否属于类A,或类名是否来自bar()的返回值?