2013-04-08 29 views
2

我曾經歷過一些我認爲是錯誤的東西,但我不確定。所以我來這裏問問知道這個比我更多的人,這是一個PHP的錯誤?看看下面幾行:不能在另一個對象中使用invoke magic方法

<h1>Tests</h1> 

<?php 
class Foo 
    { 
    public function __invoke() 
    { 
    return 'Called correctly'; 
    } 
    } 

class Boo 
    { 
    public function __construct() 
    { 
    $this->Foo = new Foo(); 
    } 
    } 

$Foo = new Foo(); 
echo $Foo(); 

echo "<br><br><hr><br><br>"; 

$Boo = new Boo(); 
echo $Boo->Foo(); 

the specification,因爲The __invoke() method is called when a script tries to call an object as a function,我應該得到這樣的:

Called correctly


Called correctly

但不執行最後的回聲。相反,我得到這個:

PHP Fatal error: Call to undefined method Boo::Foo() in [...]/index.php on line 26

這是一個錯誤或預期的行爲?如果這是一個錯誤,一些關於如何提交它的幫助將不勝感激。根據喬恩答案

EDIT進一步顯現醜陋行爲

class Doo 
    { 
    public function __construct() 
    { 
    // The Foo class is the same as the one defined before 

    $Test = new Foo(); 
    echo $Test();  // Echos correctly 

    echo "<br><br><hr><br><br>"; 

    $this->Foo = $Test; 
    echo $this->Foo(); // Error. Heisenbehaviour? 
    } 
    } 

$Boo = new Doo(); 

回答

1

這是不是一個錯誤,它並不侷限於Foo作爲一個對象,它定義__invoke。你會得到同樣的錯誤與任何可調用:

class Foo 
{ 
    private $bar = 'rand'; 

    public function __construct() 
    { 
     $this->bar(); // won't work 
    } 
} 

您需要可以寫爲兩行,或使用call_user_func

// #1 
$Boo = new Boo(); 
$Foo = $Boo->Foo; 
$Foo(); 

// #2 
$Boo = new Boo(); 
call_user_func($Boo->Foo); 
+0

但'酒吧'只是一個屬性。根據我提供的文檔鏈接,如果作爲函數調用,'Boo'中的對象'Foo'將調用它自己的方法'__invoke()'。沒有任何東西可以使'bar'成爲一種功能...... – 2013-04-08 21:12:20

+0

這就是爲什麼變通辦法起作用的原因。但是想一想你所暗示的結果:編譯器何時應該按照你的建議來對待這個構造呢?顯然不是當有一個'Bar :: Foo'方法時,只留下沒有這種方法的情況。你是在暗示,根據方法的存在或缺失,相同的語法可能會做出兩種不同的事情之一?這聽起來不是一個好主意。另外,如果既沒有財產也沒有方法會發生什麼?編譯器是否應該調用'__call'或'__get'? – Jon 2013-04-08 21:15:48

+0

我知道這不是一個好主意,但它比我剛剛編輯的行爲更好嗎?取決於存儲位置而改變行爲的對象? – 2013-04-08 21:23:28

1

參見class variable functions

它具有完全相同的問題。 PHP詞法分析器始終將語法variable T_OBJECT_OPERATOR T_STRING function_call_parameter_list識別爲方法調用。

+0

實際上,它看起來像同樣的問題,但是這在面向對象和在程序上。 – 2013-04-08 21:32:55

+0

。如果你有__invoke,匿名函數或如[「類」,「方法」]回調做...這是同樣的。 – bwoebi 2013-04-08 21:34:07

相關問題