In diesem Artikel werden hauptsächlich die Funktionen is_callable() und method_exists() in PHP vorgestellt, die einen hohen Lernwert haben.
1. Funktionsanalyse
is_callable()
Definition:
(PHP 4 >= 4.0.6, PHP 5, PHP 7)
is_callable — Überprüfen Sie, ob der Parameter eine legale aufrufbare Struktur ist
bool is_callable ( callable $name
[, bool $syntax_only
= false [, string &$callable_name
]] )
Überprüfen Sie, ob der Inhalt der Variablen als Funktion aufgerufen werden kann. Dadurch kann nach einer Variablen gesucht werden, die einen gültigen Funktionsnamen enthält, oder nach einem Array, das ein korrekt codiertes Objekt und einen Funktionsnamen enthält.
Parameter:
name
Die zu überprüfende Rückruffunktion.
syntax_only
Wenn diese Funktion auf TRUE
gesetzt ist, überprüft diese Funktion nur, ob name
eine Funktion oder Methode sein kann. Es lehnt einfach Nichtzeichen ab oder enthält keine gültige Struktur, die in der Rückruffunktion verwendet werden kann. Valid sollte zwei Elemente enthalten, das erste ist ein Objekt oder Zeichen und das zweite Element ist ein Zeichen.
callable_name
Akzeptiert „aufrufbaren Namen“. Das folgende Beispiel ist „someClass::someMethod“. Beachten Sie, dass someClass::SomeMethod() zwar eine aufrufbare statische Methode sein soll, dies im Beispiel jedoch nicht der Fall ist.
Rückgabewert:
Wenn name
aufrufbar ist, geben Sie TRUE
zurück , andernfalls geben Sie FALSE
zurück.
Referenz: http://php.net/manual/zh/function.is-callable.php
2. Funktionstest
Test 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"
Testergebnisse:
Für anonyme Funktionen nach Übergabe der Funktionsvariablen Parameter zwei syntax_only true und false, die Druckergebnisse sind die gleichen.
Test 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"
Testergebnis:
Für allgemeine Funktionen, Nach der Übergabe des Funktionsnamens und des zweiten Parameters syntax_only true und false sind die Druckergebnisse dieselben.
Test drei:
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"
Testergebnis:
Für Klassenmethode, die Parameter liegen in einer Array-Struktur vor (Klassenobjekt oder Klassenname + Methodenname), Parameter zwei syntax_only true und false, das Druckergebnis ist das gleiche.
Test 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"
Testergebnis:
对于传入的验证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 '<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"
测试结果:
对于传入的验证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 '<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视频教程
Das obige ist der detaillierte Inhalt vonPHP-Lernen: Vertiefendes Verständnis der Funktionen is_callable() und method_exists(). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!