Maison  >  Article  >  développement back-end  >  Apprentissage PHP : compréhension approfondie des fonctions is_callable() et method_exists()

Apprentissage PHP : compréhension approfondie des fonctions is_callable() et method_exists()

little bottle
little bottleavant
2019-04-25 17:10:492872parcourir

Cet article présente principalement les fonctions is_callable() et method_exists() en PHP, qui ont une grande valeur d'apprentissage. Les amis intéressés peuvent en apprendre davantage.

1. Analyse de fonction

is_callable()

Définition :

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

is_callable — Vérifiez si le paramètre est une structure appelable légale

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

Vérifiez si le contenu de la variable peut être appelé en tant que fonction. Cela peut rechercher une variable contenant un nom de fonction valide ou un tableau contenant un objet et un nom de fonction correctement codés.

Paramètres :

name

La fonction de rappel à vérifier.

syntax_only

Si elle est définie sur TRUE, cette fonction vérifie uniquement que name peut être une fonction ou une méthode. Il rejette simplement les non-caractères ou ne contient pas de structure valide pouvant être utilisée dans la fonction de rappel. Valid doit contenir deux éléments, le premier est un objet ou un caractère et le deuxième élément est un caractère.

callable_name

Accepte le "nom appelable". L'exemple ci-dessous est "someClass::someMethod". Notez que bien que someClass::SomeMethod() soit censé être une méthode statique appelable, ce n'est pas le cas dans l'exemple.

Valeur de retour :

Si name est appelable, renvoyez TRUE , sinon retournez FALSE.

Référence : http://php.net/manual/zh/function.is-callable.php

2. Test de fonctionnement

Test 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"

Résultats des tests :

Pour les fonctions anonymes, après avoir passé la variable de fonction, le paramètre deux syntax_only vrai et faux, les résultats d'impression sont les mêmes.

Test 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"

Résultat du test :

Pour le général Fonction, après avoir transmis le nom de la fonction, le paramètre deux syntax_only true et false, les résultats imprimés sont les mêmes.

Test 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"

Résultat du test :

Pour les méthodes de classe, les paramètres sont dans une structure de tableau (objet de classe ou nom de classe + nom de méthode), paramètre deux syntax_only true et false, et le résultat de l'impression est le même.

Test 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"

Résultat du test :

对于传入的验证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视频教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer