首頁  >  文章  >  後端開發  >  探究PHP中is_callable()與method_exists()函數

探究PHP中is_callable()與method_exists()函數

一个新手
一个新手原創
2017-09-06 16:24:331324瀏覽

在許多產品應用中,我們常常能夠看到以下這種用法,它用來檢查一個物件裡的方法是否存在。

<?php
    if (method_exists($object, &#39;SomeMethod&#39;)) {   
    $object->SomeMethod($this, TRUE); 
    }
?>

這段程式碼的目的比較容易理解,有一個物件為$object,我們想知道它是否有一個方法為SomeMethod,如果有,就呼叫此方法。

這個程式碼看起來正確,而且在大部分的時候運行也會正常。但是如果這個$object物件的方法對於目前的運行環境是不可見的,程式還能正常運作嗎?正如這個函數名稱方法存在一樣,只是對我們提供的類別或物件檢查是否有我們所期望的方法,如果有,就返回TRUE,如果沒有,就返回FALSE,這裡並沒有考慮可見性的問題。所以,當你恰好判斷一個私有或受保護的方法時,你能夠得到一個正確的返回,但是執行的時候,會得到一個「Fatal Error」錯誤警告。

上面這段程式碼的真正意圖應該要理解為:對於提供的類別或對象,我們能否在目前的作用域中呼叫它的SomeMethod方法。而這正是is_callable()函數存在的目的。 is_callable()函數接收一個回呼參數,可以指定一個函數名稱或一個包含方法名稱和物件的數組,如果在目前作用域中可以執行,就回傳TRUE。

<?php
    if (is_callable(array($object, &#39;SomeMethod&#39;))) {      
        $object->SomeMethod($this, TRUE); 
    }
?>

下面來舉個例子來說明兩者的差異

<?phpclass Foo {
    public function PublicMethod(){}    
    private function PrivateMethod(){}    
    public static function PublicStaticMethod(){}    
    private static function PrivateStaticMethod(){}
}
    $foo = new Foo();$callbacks = array(    
    array($foo, &#39;PublicMethod&#39;),    
    array($foo, &#39;PrivateMethod&#39;),    
    array($foo, &#39;PublicStaticMethod&#39;),    
    array($foo, &#39;PrivateStaticMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PublicMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PrivateMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PublicStaticMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PrivateStaticMethod&#39;),
   );
   foreach ($callbacks as $callback){
    var_dump($callback);
    var_dump(method_exists($callback[0], $callback[1]));
    var_dump(is_callable($callback));    
    echo str_repeat(&#39;-&#39;, 10);    
    echo &#39;<br />&#39;;
}

執行上面的腳本後,我們會清楚地看到兩個函數間的差異。

is_callable()還有其他的用法,例如,不檢查所提供的類別或方法,只檢查函數或方法的語法是否正確。像method_exists()一樣,is_callable()可以觸發類別的自動載入。

如果一個物件存在魔術方法__call,在進行方法判斷時method_exists()會傳回FALSE,而is_callable()會傳回TRUE。

<?phpclass MethodTest {
    public function __call($name, $arguments){
      echo &#39;Calling object method &#39; . $name . &#39; &#39; .implode(&#39;, &#39;, $arguments);      
      echo &#39;<br />&#39;;
    }
}$obj = new MethodTest();$obj->runtest(&#39;in object context&#39;);
var_dump(method_exists($obj,&#39;runtest&#39;));
var_dump(is_callable(array($obj,&#39;runtest&#39;)));

echo &#39;<br />&#39;;

執行結果

Calling object method runtest in object context
bool(false) bool(true)

探究PHP中is_callable()與method_exists()函數

#在許多產品應用中,我們常常能夠看到以下這種用法,它用來檢查一個物件裡的方法是否存在。

<?phpif (method_exists($object, &#39;SomeMethod&#39;)) {   
    $object->SomeMethod($this, TRUE); 
}?>

這段程式碼的目的比較容易理解,有一個物件為$object,我們想知道它是否有一個方法為SomeMethod,如果有,就呼叫此方法。

這個程式碼看起來正確,而且在大部分的時候運行也會正常。但是如果這個$object物件的方法對於目前的運行環境是不可見的,程式還能正常運作嗎?正如這個函數名稱方法存在一樣,只是對我們提供的類別或物件檢查是否有我們所期望的方法,如果有,就返回TRUE,如果沒有,就返回FALSE,這裡並沒有考慮可見性的問題。所以,當你恰好判斷一個私有或受保護的方法時,你能夠得到一個正確的返回,但是執行的時候,會得到一個「Fatal Error」錯誤警告。

上面這段程式碼的真正意圖應該要理解為:對於提供的類別或對象,我們能否在目前的作用域中呼叫它的SomeMethod方法。而這正是is_callable()函數存在的目的。 is_callable()函數接收一個回呼參數,可以指定一個函數名稱或一個包含方法名稱和物件的數組,如果在目前作用域中可以執行,就回傳TRUE。

<?php
    if (is_callable(array($object, &#39;SomeMethod&#39;))) {      
    $object->SomeMethod($this, TRUE); 
    }
?>

下面來舉個例子來說明兩者的差異

<?php
    class Foo {
    public function PublicMethod(){}    
    private function PrivateMethod(){}    
    public static function PublicStaticMethod(){}    
    private static function PrivateStaticMethod(){}
}
$foo = new Foo();$callbacks = array(    
    array($foo, &#39;PublicMethod&#39;),    
    array($foo, &#39;PrivateMethod&#39;),    
    array($foo, &#39;PublicStaticMethod&#39;),    
    array($foo, &#39;PrivateStaticMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PublicMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PrivateMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PublicStaticMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PrivateStaticMethod&#39;),
   );
   foreach ($callbacks as $callback){
    var_dump($callback);
    var_dump(method_exists($callback[0], $callback[1]));
    var_dump(is_callable($callback));    
    echo str_repeat(&#39;-&#39;, 10);    
    echo &#39;<br />&#39;;
}

執行上面的腳本後,我們會清楚地看到兩個函數間的差異。

is_callable()還有其他的用法,例如,不檢查所提供的類別或方法,只檢查函數或方法的語法是否正確。像method_exists()一樣,is_callable()可以觸發類別的自動載入。

如果一個物件存在魔術方法__call,在進行方法判斷時method_exists()會傳回FALSE,而is_callable()會傳回TRUE。

<?phpclass MethodTest {
    public function __call($name, $arguments){
      echo &#39;Calling object method &#39; . $name . &#39; &#39; .implode(&#39;, &#39;, $arguments);      
      echo &#39;<br />&#39;;
    }
}
$obj = new MethodTest();$obj->runtest(&#39;in object context&#39;);
var_dump(method_exists($obj,&#39;runtest&#39;));
var_dump(is_callable(array($obj,&#39;runtest&#39;)));
echo &#39;<br />&#39;;

執行結果

Calling object method runtest in object context
bool(false) bool(true)

探究PHP中is_callable()與method_exists()函數

#

以上是探究PHP中is_callable()與method_exists()函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn