ホームページ  >  記事  >  バックエンド開発  >  PHP の学習: is_callable() 関数と method_exists() 関数の深い理解

PHP の学習: is_callable() 関数と method_exists() 関数の深い理解

little bottle
little bottle転載
2019-04-25 17:10:492854ブラウズ

この記事では学習価値の高い 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

#チェックするコールバック関数。

syntax_only

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 &#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"
テスト結果:

匿名関数の場合、関数変数、パラメーター 2 を渡した後 syntax_only true と false

の場合、印刷結果は同じです。 ##テスト 2:

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"
テスト結果: 一般関数の場合、次のとおりです。関数名、パラメーター 2 の syntax_only true と false

を渡しても、出力される結果は同じです。 テスト 3:

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"

テスト結果: クラスメソッド、パラメータは配列構造(クラスオブジェクトまたはクラス名メソッド名)、パラメータ2

syntax_only

trueとfalse、印刷結果は同じです。

テスト 4:

$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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。