2014-02-12 47 views
4

我試圖在反射類中找到一個魔術方法的檢查,但它不在那裏。也許PHP(我使用PHP 5.3)有一些其他工具來解決這個問題?類似這樣的:如何檢查它的魔法或不?

class myClass { 

    public function __call($method, $arguments) 
    { 
     return 'is magic'; 
    } 

    public function notMagic() 
    { 
     return 'not a magic'; 
    } 

} 


$reflection = new ReflectionMethod('myClass', 'magic'); 

if ($reflection->isMagic()) 
{ 
    /* do something if is magic*/ 
} 
+0

請澄清並改述你的問題,目前尚不清楚你想要什麼。 –

+0

我想檢查,可調用的方法是不是魔法。對不起,我的英文 –

+1

是否足以說如果'method_exists('myClass','isMagic')'返回false,它將不得不通過你的'__call()'處理程序進行處理? – Scuzzy

回答

2

由於PHP沒有提供檢查方法是否有魔力的方法,所以您有兩個選項。

的文檔說開始

PHP保留所有函數名以__爲神奇。它是 建議您不要在PHP中使用帶__的函數名,除非 需要一些記錄的魔術功能。

因此你可以只檢查,看看是否該方法的名稱與__開始:

if(strpos($methodName, '__') === 0){ 
    echo "$methodName is magic"; 
} 

這樣做的缺點是,有人可以使一個方法__myNewMethod,它將盡管PHP被視爲神奇的不實際用它做任何事情。

或者,您可以擁有一個名稱白名單。此外,根據文檔,下面的方法是神奇:

__construct(), __destruct(), __call(), __callStatic(), 
__get(), __set(), __isset(), __unset(), __sleep(), 
__wakeup(), __toString(), __invoke(), __set_state() and __clone() 

這種方法的缺點是,PHP的未來版本可能會增加,並從該列表使得代碼不正確刪除。

選擇可能取決於您想如何使用此信息。

PHP Magic Methods

+0

大多數人在PHP世界描述考慮'_name'是內部的應用程序,但不是PHP而'__name'作爲PHP的內部。我個人堅持這個慣例,並在我的代碼中執行它。 – Christian