首頁  >  文章  >  後端開發  >  PHP學習之深入理解is_callable()和method_exists()函數

PHP學習之深入理解is_callable()和method_exists()函數

little bottle
little bottle轉載
2019-04-25 17:10:492857瀏覽

本篇文章主要介紹了PHP中的is_callable()和method_exists()函數,具有很高的學習價值,有興趣的朋友可以學習一下。

一、函式解析

#is_callable()

定義:

#(PHP 4 >= 4.0.6, PHP 5, PHP 7)  

is_callable — 偵測參數是否為合法的可呼叫結構

bool is_callable (  callable $name [, bool $syntax_only = false [, string ## = false [, string #&$callable_name# ]] )

驗證變數的內容能否作為函數調用。這可以檢查包含有效函數名的變量,或者一個數組,包含了正確編碼的物件以及函數名。 參數:

name

要檢查的回呼函數。

syntax_only

#如果設定為 TRUE,這個函數只是驗證 

name

 可能是函數或方法。它僅僅拒絕非字符,或未包含能用於回調函數的有效結構。有效的應該包含兩個元素,第一個是一個物件或字符,第二個元素是個字符。

callable_name

#接受「可呼叫的名稱」。下面的例子是「someClass::someMethod」。注意,儘管 someClass::SomeMethod() 的意思是可呼叫的靜態方法,但例子的情況並不是這樣的。 傳回值:

#如果 name 可呼叫則回傳 TRUE,否則回傳 

FALSE

參考: http://php.net/manual/zh/function.is-callable.php

#二、函數測試

測試一:

echo &#39;<pre >&#39;;
$func = function ($a)
{
    echo $a;
};
$re = is_callable($func, true, $callable_name1);
echo &#39;<hr />&#39;;
$re1 = is_callable($func, false, $callable_name2);

//结果
bool(true)
string(17) "Closure::__invoke"
-------------------------------------
bool(true)
string(17) "Closure::__invoke"

測試結果:

#對於匿名函數,傳入函數變數後,參數二syntax_only true 和false

,列印結果是一樣的。

測試二:

function c_b($d)
{
    echo $d;
}
$re = is_callable(&#39;c_b&#39;, false, $callable_name1);
$re1 = is_callable(&#39;c_b&#39;, true, $callable_name2);
var_dump($re);
echo &#39;<hr />&#39;;
var_dump($re1);
echo &#39;<hr />&#39;;
var_dump($callable_name1);
echo &#39;<hr />&#39;;
var_dump($callable_name2);
//结果
bool(true)
----------------
bool(true)
----------------
string(3) "c_b"
----------------
string(3) "c_b"

 

測試結果:對於一般函數,傳入函數名稱後,參數二syntax_only 

#true 和false

,列印結果是一樣的。

測試三:

class Person
{
    public static function get($a)
    {
        echo $a;
    }

    protected function _set()
    {
        echo 1;
    }
}
$p = new Person();

$re = is_callable([$p, &#39;get&#39;], false, $callable_name1);
$re1 = is_callable([$p, &#39;get&#39;], true, $callable_name2);
var_dump($re);
echo &#39;<hr />&#39;;
var_dump($re1);
echo &#39;<hr />&#39;;
var_dump($callable_name1);
echo &#39;<hr />&#39;;
var_dump($callable_name2);
//结果
bool(true)
-----------------
bool(true)
-----------------
string(11) "Person::get"
---------------------------
string(11) "Person::get"

#測試結果:

##對於類別的方法,參數以陣列結構(類別物件或類別名稱方法名稱),參數二syntax_only true 和false

,列印結果也是一樣的。

測試四:

$a = &#39;i am string&#39;;
$re = is_callable($a, false, $callable_name1);
$re1 = is_callable($a, true, $callable_name2);
var_dump($re);
echo &#39;<hr />&#39;;
var_dump($re1);
echo &#39;<hr />&#39;;
var_dump($callable_name1);
echo &#39;<hr />&#39;;
var_dump($callable_name2);
//结果
bool(false)
----------------
bool(true)
----------------
string(11) "i am string"
-------------------------
string(11) "i am string"
測試結果:

#######

对于传入的验证name,如果syntax_only 设置为true,它验证传入name是否是字符串,是否含有非法字符,如果不含有,则返回true,它并不会验证name是否为合法调用结构。

测试五:

$re = is_callable([&#39;Class&#39;, &#39;Method&#39;], false, $callable_name1);
$re1 = is_callable([&#39;Class&#39;, &#39;Method&#39;], true, $callable_name2);
var_dump($re);
echo &#39;<hr />&#39;;
var_dump($re1);
echo &#39;<hr />&#39;;
var_dump($callable_name1);
echo &#39;<hr />&#39;;
var_dump($callable_name2);
//结果
bool(false)
--------------
bool(true)
--------------
string(13) "Class::Method"
-----------------------------
string(13) "Class::Method"

测试结果:

对于传入的验证name,如果syntax_only 设置为true,它只验证传入name是否是字符串,是否含有非法字符或是否为数组参数字符串1 + 字符串二,如果符合条件,则返回true,它并不会验证name是否为合法调用结构。否者返回false;

测试六:

class Person
{
    public static function get($a)
    {
        echo $a;
    }

    protected function _set()
    {
        echo 1;
    }
}
$p = new Person();
$re = is_callable([$p, &#39;_set&#39;], false);
var_dump($re);
echo &#39;<hr />&#39;;
$re1 = method_exists($p, &#39;_set&#39;);
var_dump($re1);
//结果
bool(false)
------------
bool(true)

测试结果:

对于函数is_callable() 来说,如果验证的类方法,访问修饰符为protected或private 则返回false

对于method_exists() 来说,则不受访问修饰符的影响,只要类方法存在,则返回true。

 三、总结、

1、is_callable() 函数,可传入的name类型有:函数字符串,匿名函数变量,类或类对象和方法名称组成的数组。其函数第二参数,如果是true,则只验证name是否是字符串或则是类或字符串1(类对象)和字符串二(方法名称)组成的数组。而不验证name是否为合法调用结构。如果是false,则验证name是否为合法调用结构。

2、method_exists() 函数,不受访问修饰符的影响,只要类方法存在,则返回true。函数is_callable()来说,如果验证的类方法,访问修饰符为protected或private 则返回false。

 相关教程:PHP视频教程

以上是PHP學習之深入理解is_callable()和method_exists()函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除