2010-12-18 61 views
2

这真是烦人,你不能做这些事情(和它没有任何意义,你不能)对象实例化之后我能想到的事情是有一个静态函数来返回一个新对象使用对象操作符在PHP

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()当然返回的对象的引用。

+2

我同意并同情,但你的问题是什么?我认为这不能被规避... – 2010-12-18 17:24:13

+0

我希望有一个模式如何做到这一点,而不会使用基本上什么都不做的静态函数混淆您的代码。 – slosd 2010-12-18 17:29:47

+0

还没有,也许在PHP 5.4 :) – StasM 2010-12-19 04:31:05

回答

2

这不是对的回答“如何做到这一点,而不会混淆你的代码......”但希望在隧道尽头显示一些光。

这个特定主题最近有一个RFC(另请参阅相关的developer discussion),虽然有几点需要解决,但反应非常有利。

与此同时,无论您是否喜欢,您都必须坚持使用您的工厂。

1

不,据我所知,使用像你这样的功能是唯一的解决方法。

我不是PHP的内部工作的大师,但建筑师的原因可能是new是一种语言结构,可以接受不同种类的表达式。因此,

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

将ambigous:是新的对象意欲类A的,还是类名来自bar()的返回值?

+0

你说得对。事实上,我实际上并不期望这个工作。这就是为什么我添加了正确的括号的例子(新A('foo')) - > bar()' – slosd 2010-12-18 18:49:12

2

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

PHP 5.4.0提供内容广泛新功能范围:

班级成员访问权限已经添加了例如(new Foo) - > bar()。

+1

虽然这可能在理论上回答这个问题,[这将是更可取的](http://meta.stackexchange.com/q/8259)在这里包括答案的基本部分,并提供参考链接。 – 2014-01-27 16:44:05

+0

我写了我的答案,相信满意的答案只是说“现在有可能,从版本x开始”,并且链接仅供参考。无论如何,kmas已经将该部分修改为答案,但正如您所看到的,这只是问题的确切副本,因为问题本身现在也是答案。 – 2014-03-06 15:33:50