溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

關于PHP中is_callable()與method_exists()函數(shù)的用法

發(fā)布時間:2020-04-02 14:49:55 來源:億速云 閱讀:126 作者:小新 欄目:編程語言

今天小編給大家分享的是關于PHP中is_callable()與method_exists()函數(shù)的用法,很多人都不太了解,今天小編為了讓大家更加了解PHP,所以給大家總結了以下內容,一起往下看吧。一定會有所收獲的哦。

關于PHP中is_callable()與method_exists()函數(shù)的用法

在很多產(chǎn)品應用中,我們經(jīng)常能夠看到以下這種用法,它用來檢查一個對象里的方法是否存在。

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

這段代碼的目的比較容易理解,有一個對象為$object,我們想知道它是否有一個方法為SomeMethod,如果有,就調用此方法。

這個代碼看起來正確,而且在大部分的時候運行也會正常。但是如果這個$object對象的方法對于當前的運行環(huán)境是不可見的,程序還能正常運行嗎?正如這個函數(shù)名方法存在一樣,只是對我們提供的類或對象檢查是否有我們所期望的方法,如果有,就返回TRUE,如果沒有,就返回FALSE,這里并沒有考慮可見性的問題。所以,當你恰好判斷一個私有或者受保護的方法時,你能夠得到一個正確的返回,但是執(zhí)行的時候,會得到一個“Fatal Error”錯誤警告。

上面這段代碼的真正意圖應該理解為:對于提供的類或者對象,我們能否在當前的作用域中調用它的SomeMethod方法。而這正是is_callable()函數(shù)存在的目的。is_callable()函數(shù)接收一個回調參數(shù),可以指定一個函數(shù)名稱或者一個包含方法名和對象的數(shù)組,如果在當前作用域中可以執(zhí)行,就返回TRUE。

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

下面來舉個例子來說明兩者的區(qū)別

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

執(zhí)行上面的腳本后,我們會清晰地看到兩個函數(shù)間的差別。

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

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

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

運行結果

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

關于PHP中is_callable()與method_exists()函數(shù)的用法

關于PHP中is_callable()與method_exists()函數(shù)的用法就分享到這里了,當然并不止以上和大家分析的辦法,不過小編可以保證其準確性是絕對沒問題的。希望以上內容可以對大家有一定的參考價值,可以學以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI