2011-02-22 63 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