PHP中的新方法/方法链接

PHP中的新方法/方法链接,php,Php,我已经编写了一些面向对象的PHP5代码,但它不会解析,我也不完全确定原因。我用方法链简化了很多,看起来是这样的 $head->AddTag(new Tag('meta')->Extras('http-equiv="Content-Type" content="text/html; charset=utf-8"')); 显然,它有意外的T\u OBJECT\u操作符。这对我来说似乎非常有效-问题出在哪里?这里: new Tag('meta')-> 遗憾的是,链接与new结合使

我已经编写了一些面向对象的PHP5代码,但它不会解析,我也不完全确定原因。我用方法链简化了很多,看起来是这样的

$head->AddTag(new Tag('meta')->Extras('http-equiv="Content-Type" content="text/html; charset=utf-8"'));
显然,它有意外的
T\u OBJECT\u操作符
。这对我来说似乎非常有效-问题出在哪里?

这里:

new Tag('meta')->
遗憾的是,链接与
new
结合使用是无效的

别问我为什么,我想要它。(编辑:@troelskn解释了原因。我没在想。)

您需要在调用外部声明
新标记('meta')
。构建可以为您提供对象的通用静态工厂类也应该可以工作,如下所示:

$head->AddTag(Factory::create("Tag", "meta")-> .....
一个例子应该是这样的——我正在胡思乱想并写一个非泛型的,我现在懒得写一个泛型的,因为这很复杂:)


这在PHP中是无效的语法。原因是php既有类又有自由浮动函数。因此,您可能会遇到不明确的情况,例如:

function foo () { return "bar"; }
class foo {}
class bar {}

$x = new foo();
// Is $x a "foo" or a "bar"?
如果需要链接,可以创建函数并用作工厂。作为类上的静态成员或自由浮动函数。我更喜欢后者,内容如下:

function foo() { return new Foo(); }
class Foo {
  funcion bar() {}
}

// Usage:
foo()->bar();

好吧,在某个地方有一个提案在讨论这个问题,但问题是:
new X()->y()
是指
(new X())->y()
还是
new(X()->y())
?然而,我也错过了这个语法糖。@mellamokb我不这么认为,他只是想把它作为一个例子等等,一个工厂如何实现::create?@DeadMG我添加了一个非通用的例子。泛型工厂有点难,它需要计算使用
func\u get\u args()
func\u num\u args()
传递的所有参数,并将它们传递给要使用的类的构造函数。@Pekka:是的,这是我试图避免的,因为我有几个类的构造函数可以用这种方式链接。我将尝试自己编写一个泛型版本。在_构造中不可能返回实例吗?i、 e.
返回此信息
@Jaitsu no,
\u构造
无法返回anything@jaitsu-即使您可以从构造函数返回(您不能返回),也不会有帮助,因为这是一个语法问题,因此发生在解析时,而不是运行时。
function foo() { return new Foo(); }
class Foo {
  funcion bar() {}
}

// Usage:
foo()->bar();