2011-02-22 72 views
1

我已经写了一些面向对象的PHP5代码,但它不会解析,我也不完全确定为什么。我使用的方法链简化了很多它 - 和它看起来像这样PHP中的新/方法链接

$head->AddTag(new Tag('meta')->Extras('http-equiv="Content-Type" content="text/html; charset=utf-8"')); 

显然,它有意想不到的T_OBJECT_OPERATOR。这对我来说似乎完全有效 - 问题在哪里?

回答

3

这里:

new Tag('meta')-> 

可悲的是,链接是不符合new同时使用。

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

您需要在呼叫之外声明new Tag('meta')。建立一个通用的静态工厂类,可以给你一个对象也应该工作,像这样:

$head->AddTag(Factory::create("Tag", "meta")-> ..... 

一个例子应该是这个样子 - 我wussing出和写入非普通一个,我懒得写一个通用的一个,因为这是复杂的:)

public static function createTag($meta) 
{ 
    return new Tag($meta); 
} 
+0

据我所知是在某个地方讨论这一提议,但问题是:是否'新的X() - > Y()'平均'(新的X()) - > y()'或'new(X() - > y())'?但是,我也想念这个句法糖。 – KingCrunch 2011-02-22 22:48:35

+0

如果插入这些括号,是否正常工作? – mellamokb 2011-02-22 22:49:33

+0

@mellamokb我不这么认为,他只是将其作为一个例子 – 2011-02-22 22:49:59

0

这不是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(); 
+0

在你的__construct中不可能返回实例吗?即''返回这个;' – JamesHalsall 2011-02-22 22:57:52

+0

@Jaitsu no,'__construct'不能返回任何东西 – 2011-02-22 23:00:50

+0

@Pekka,欢呼...可能为什么我从来没有尝试过 – JamesHalsall 2011-02-22 23:10:16