この記事では学習価値の高い PHP の is_callable() 関数と method_exists() 関数を中心に紹介しますので、興味のある方はぜひ学んでみてください。
#1. 関数の分析
##is_callable()
#定義: (PHP 4 >= 4.0.6、PHP 5、PHP 7)
is_callable —
パラメータが正当な呼び出し可能な構造体かどうかを検出しますbool
is_callable ( callable $name [, bool
$syntax_only = false [, string &$callable_name ]] )
##変数の内容が次のように呼び出せるかどうかを確認します。機能 。これにより、有効な関数名を含む変数、または正しくエンコードされたオブジェクトと関数名を含む配列をチェックできます。
# パラメータ:
##name
#チェックするコールバック関数。
TRUE に設定すると、この関数は
name のみを検証します 関数またはメソッドの場合があります。非文字を単に拒否するか、コールバック関数で使用できる有効な構造が含まれていません。 Valid には 2 つの要素が含まれている必要があります。最初の要素はオブジェクトまたは文字で、2 番目の要素は文字です。
callable_name
「呼び出し可能な名前」を受け入れます。以下の例は「someClass::someMethod」です。 someClass::SomeMethod() は呼び出し可能な静的メソッドであることを意図していますが、この例ではそうではないことに注意してください。
##name を呼び出すことができる場合TRUE、それ以外の場合は FALSE を返します。
#参考:
#http://php.net/manual/zh/function.is-callable.php
#2. 機能テストテスト 1:
#
echo '<pre >'; $func = function ($a) { echo $a; }; $re = is_callable($func, true, $callable_name1); echo '<hr />'; $re1 = is_callable($func, false, $callable_name2); //结果 bool(true) string(17) "Closure::__invoke" ------------------------------------- bool(true) string(17) "Closure::__invoke"
匿名関数の場合、関数変数、パラメーター 2 を渡した後 syntax_only true と false
の場合、印刷結果は同じです。 ##テスト 2:
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 '<hr />';
var_dump($re1);
echo '<hr />';
var_dump($callable_name1);
echo '<hr />';
var_dump($callable_name2);
//结果
bool(true)
----------------
bool(true)
----------------
string(3) "c_b"
----------------
string(3) "c_b"
を渡しても、出力される結果は同じです。 テスト 3:
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 '<hr />';
var_dump($re1);
echo '<hr />';
var_dump($callable_name1);
echo '<hr />';
var_dump($callable_name2);
//结果
bool(true)
-----------------
bool(true)
-----------------
string(11) "Person::get"
---------------------------
string(11) "Person::get"
テスト結果: クラスメソッド、パラメータは配列構造(クラスオブジェクトまたはクラス名メソッド名)、パラメータ2
syntax_onlytrueとfalse、印刷結果は同じです。
テスト 4:$a = 'i am string';
$re = is_callable($a, false, $callable_name1);
$re1 = is_callable($a, true, $callable_name2);
var_dump($re);
echo '<hr />';
var_dump($re1);
echo '<hr />';
var_dump($callable_name1);
echo '<hr />';
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是否为合法调用结构。 测试五: 测试结果: 对于传入的验证name,如果syntax_only 设置为true,它只验证传入name是否是字符串,是否含有非法字符或是否为数组参数字符串1 + 字符串二,如果符合条件,则返回true,它并不会验证name是否为合法调用结构。否者返回false; 测试六:$re = is_callable(['Class', 'Method'], false, $callable_name1);
$re1 = is_callable(['Class', 'Method'], true, $callable_name2);
var_dump($re);
echo '<hr />';
var_dump($re1);
echo '<hr />';
var_dump($callable_name1);
echo '<hr />';
var_dump($callable_name2);
//结果
bool(false)
--------------
bool(true)
--------------
string(13) "Class::Method"
-----------------------------
string(13) "Class::Method"
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 '<hr />';
$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 中国語 Web サイトの他の関連記事を参照してください。