你不能做任何这些事情真的很烦人(而且你不能做任何事情):
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()
当然会返回对象的引用。
答案 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()
的返回值?