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

little bottle
發布: 2023-04-06 11:26:02
轉載
2722 人瀏覽過

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

一、函式解析

#is_callable()

定義:

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

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

boolis_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 '
'; $func = function ($a) { echo $a; }; $re = is_callable($func, true, $callable_name1); echo '
'; $re1 = is_callable($func, false, $callable_name2); //结果 bool(true) string(17) "Closure::__invoke" ------------------------------------- bool(true) string(17) "Closure::__invoke"
登入後複製

測試結果:

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

,列印結果是一樣的。

測試二:

function c_b($d) { echo $d; } $re = is_callable('c_b', false, $callable_name1); $re1 = is_callable('c_b', true, $callable_name2); var_dump($re); echo '
'; var_dump($re1); echo '
'; var_dump($callable_name1); echo '
'; 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, 'get'], false, $callable_name1); $re1 = is_callable([$p, 'get'], true, $callable_name2); var_dump($re); echo '
'; var_dump($re1); echo '
'; var_dump($callable_name1); echo '
'; var_dump($callable_name2); //结果 bool(true) ----------------- bool(true) ----------------- string(11) "Person::get" --------------------------- string(11) "Person::get"
登入後複製

#測試結果:

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

,列印結果也是一樣的。

測試四:

$a = 'i am string'; $re = is_callable($a, false, $callable_name1); $re1 = is_callable($a, true, $callable_name2); var_dump($re); echo '
'; var_dump($re1); echo '
'; var_dump($callable_name1); echo '
'; 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(['Class', 'Method'], false, $callable_name1); $re1 = is_callable(['Class', 'Method'], true, $callable_name2); var_dump($re); echo '
'; var_dump($re1); echo '
'; var_dump($callable_name1); echo '
'; 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, '_set'], false); var_dump($re); echo '
'; $re1 = method_exists($p, '_set'); 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
作者最新文章
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!