2009-11-01 117 views
5

我有一個類Logger,其中有一個方法Log
由於LogLogger實例的最常見的用法,我有線__invoke調用LogPHP Callable Object as Object Member

另一類,「網站」包含一個成員「日誌」,記錄器的實例。

爲什麼將這項工作:

$Log = $this->Log; 
$Log("Message"); 

但不是這樣的:

$this->Log("Message"); 

前者失敗, 「PHP致命錯誤:調用未定義的方法網站::日誌()」
是這是可調用對象實現的限制,還是我誤解了某些東西?

回答

1

同樣的原因,你不能做到這一點:

$value = $this->getArray()["key"];

甚至這個

$value = getArray()["key"];

因爲PHP語法並不做短線的手非常好。

+0

主要是因爲寬鬆的打字。實際上沒有辦法推斷你可能意味着做什麼,所以它默認提前錯誤。 – 2009-11-01 02:21:32

+0

我寫了一個奇怪的preparser,允許寫這樣的表達式:http://code.google.com/p/php-preparser/ :)(我可以在這裏「公佈」我的開源解決方案嗎?) – 2009-11-01 02:23:23

+5

這個例子不再相關,這個語法現在起作用。 – 2014-09-05 15:44:10

1

這可能工作:

${this->Log}("Message"); 

但也許它使用完整的呼叫只是更容易和更好嗎?似乎沒有辦法在一條線上得到你想要的工作。

您的問題中的錯誤表明它正在尋找一個不存在的類上定義的函數。一個可調用的對象不是一個函數,在這種情況下它似乎不能被視爲一個函數。

+0

將無法​​正常工作(至少不適用於我的PHP 5.3)»意想不到的T_OBJECT_OPERATOR ...« – knittl 2011-08-10 15:16:53

7

不幸的是,這仍然是PHP的一個限制,但是當你考慮它的時候它是有意義的,因爲一個類可以包含共享名字的屬性和方法。例如:

<?php 
class Test { 
    public $log; 

    public function __construct() { 
     $this->log = function() { 
      echo 'In Test::log property'; 
     }; 
    } 

    public function log() { 
     echo 'In Test::log() method'; 
    } 
} 

$test = new Test; 
$test->log(); // In Test::log() method 
call_user_func($test->log); // In Test::log property 
?> 

如果PHP允許你想要的語法,哪個函數會被調用?不幸的是,這隻剩下call_user_func[_array]()(或將$this->log複製到另一個變量並調用它)。

不過,這將是很好,如果下面的語法是可以接受的:

<?php 
{$test->log}(); 
?> 

但很可惜,事實並非如此。

+0

這確實是一個奇怪的怪癖。類似於($ test-> log)()似乎大多是解析器的限制,而不是語言本身。 – 2014-09-05 16:23:50

相關問題