我曾經歷過一些我認爲是錯誤的東西,但我不確定。所以我來這裏問問知道這個比我更多的人,這是一個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();
但'酒吧'只是一個屬性。根據我提供的文檔鏈接,如果作爲函數調用,'Boo'中的對象'Foo'將調用它自己的方法'__invoke()'。沒有任何東西可以使'bar'成爲一種功能...... – 2013-04-08 21:12:20
這就是爲什麼變通辦法起作用的原因。但是想一想你所暗示的結果:編譯器何時應該按照你的建議來對待這個構造呢?顯然不是當有一個'Bar :: Foo'方法時,只留下沒有這種方法的情況。你是在暗示,根據方法的存在或缺失,相同的語法可能會做出兩種不同的事情之一?這聽起來不是一個好主意。另外,如果既沒有財產也沒有方法會發生什麼?編譯器是否應該調用'__call'或'__get'? – Jon 2013-04-08 21:15:48
我知道這不是一個好主意,但它比我剛剛編輯的行爲更好嗎?取決於存儲位置而改變行爲的對象? – 2013-04-08 21:23:28