2016-11-16 23 views
1

讓我們考慮下面的代碼:「操作員」優先?爲什麼new Object() - > method()在PHP中給出語法錯誤?

<?php 

class X{ 
    public function test(){ 
     return 'test'; 
    } 
} 

//This obviously works: 
$x = (new X())->test(); 
//This does not, syntax error 
$x = new X()->test(); 
echo $x; 

爲什麼?

BTW: 我知道它是在PHP 5.4

這不是介紹「如何」,它是關於「爲什麼」 - 我知道第一語法是一個在文檔中。其實,它更多的是在哪裏以及如何找到答案。

從我學會爲止,一邊問我的問題在其他地方:

的 - >並不是真正的「運營商」,這是一個「令牌」或「詞法標記」 - 這不利於我很多。

第一個版本等於說:「new(DateTime() - > format())」顯然是不好的。這表明它是關於「運算符優先級」,但是#1 - - >不是運算符(對吧?),#2 - 爲什麼這不記錄在任何地方?

順便說一下,在http://php.net/manual/en/language.operators.precedence.php我們可以看到,「新」操作符關聯既不是左也不是右,它沒有,我們也可以讀「非相關優先等值的操作符不能彼此相鄰使用,例如1 < 2> 1在PHP中是非法的「因此...如果 - >是一個運算符(並且它是非關聯的),那麼一切都會清楚,但它是一個運算符嗎?如果是,那麼爲什麼不列在上面的列表中(http://php.net/manual/en/language.operators.precedence.php)?

+1

相關,雖然不是很有幫助:http://stackoverflow.com/questions/34377118/is-there-a-way-to-create-an-anonymous-object-in-php/34377153#comment57161837_34377153 – Paulpro

+0

是的,感謝@Paulpro - 似乎沒有答案,我只需要忍受那:)再次感謝! – konrados

+1

「不得不忍受它」是一個典型的結論,任何事情都與PHP的解析器有關...... – deceze

回答

1

因爲它是不明確的,即它可以以兩種不同的方式來解釋:在一個新的X實例

  • 呼叫test()(你想要的):

     
    $object = new X(); 
    $x  = $object->test(); 
    
  • 創建由法test()對象上返回的類名的新實例由功能X()返回:

     
    $object = X(); 
    $class = $object->test(); 
    $x  = new $class(); 
    

奇怪的是,居然沒有辦法寫一行代碼對於第二種情況...以下是行不通的:

new (X()->test()); // syntax error 
new (X()->test())(); // syntax error 

但儘管如此,你的想法。

+0

第二種情況是語法錯誤,因爲'(new ...) - >'語法是硬編碼的特例在5.x中的解析器中。從版本7 PHP開始運行一個實際的AST解析器......它仍然是一個錯誤嗎? (懶得現在測試;)) – deceze

+0

是的,是的...我在發佈前測試過。 :) – Narf

+0

這很有道理,@Narf - 謝謝你!那麼,我的意思是前兩種情況,因爲正如你所說,第三起案件背後還有一個謎,但也許這可能是另一個問題。再次感謝! – konrados

相關問題