Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中对象实例化后立即使用对象运算符_Php_Oop - Fatal编程技术网

在PHP中对象实例化后立即使用对象运算符

在PHP中对象实例化后立即使用对象运算符,php,oop,Php,Oop,你不能做这些事情真的很烦人,你不能这样做也没有任何意义: new A('foo')->bar(); (new A('foo'))->bar(); 我唯一能想到的就是使用一个静态函数返回一个新对象 public static function get($a) { return new self($a); } // ... A::get('foo')->bar(); 但那太难看了。 之所以需要这样做,是因为在对象定义的上下文中,我主要将新对象作为参数或数组的一部分传递:

你不能做这些事情真的很烦人,你不能这样做也没有任何意义:

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()
));

当然,返回对对象的引用

不,据我所知,使用你展示的函数是解决这个问题的唯一方法

我不是PHP内部工作的大师,但架构上的原因可能是new是一种语言构造,可以接受不同类型的表达式。所以,

 new A('foo')->bar()
可能是模棱两可的:新对象是打算属于类A,还是类名来自bar的返回值?

这不是如何做到这一点而不使代码混乱的答案……但希望在隧道的尽头能看到一些曙光

最近就这一特定主题进行了一次讨论,请参见相关内容。虽然有几点需要解决,但反应非常积极

同时,不管你喜欢与否,你都必须坚持你的工厂

RFC- 讨论-
在PHP 5.4中,这已经成为可能,因此不需要任何变通方法:

PHP 5.4.0提供了一系列新功能:

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


我同意并同情你,但你的问题是什么?我认为这是无法避免的…我希望有一种模式可以做到这一点,而不会让静态函数基本上什么都不做,这是正确的。事实上,我并不指望这能奏效。这就是为什么我用正确的括号添加了一个新的“foo”->Bar,虽然这可以从理论上回答这个问题,在这里包括答案的基本部分,并提供链接供参考。我写下我的答案,相信令人满意的答案只是说,从版本x开始,现在是可能的,而这个链接只是作为参考。无论如何,凯马斯已经修改了答案的部分,但正如你所看到的,这只是问题的一个精确副本,因为问题本身现在也是答案。