Entdecken Sie die Funktionen is_callable() und method_exists() in PHP

一个新手
Freigeben: 2023-03-15 18:52:02
Original
1340 Leute haben es durchsucht

In vielen Produktanwendungen können wir häufig die folgende Verwendung sehen, mit der überprüft wird, ob eine Methode in einem Objekt vorhanden ist.

<?php
    if (method_exists($object, &#39;SomeMethod&#39;)) {   
    $object->SomeMethod($this, TRUE); 
    }
?>
Nach dem Login kopieren

Der Zweck dieses Codes ist relativ einfach zu verstehen. Es gibt ein Objekt namens $object. Wir möchten wissen, ob es eine Methode namens SomeMethod hat.

Dieser Code sieht korrekt aus und wird die meiste Zeit einwandfrei funktionieren. Aber wenn die Methode dieses $object-Objekts für die aktuelle Ausführungsumgebung unsichtbar ist, kann das Programm dann trotzdem normal ausgeführt werden? So wie diese Funktionsnamensmethode existiert, prüft sie lediglich, ob die von uns bereitgestellte Klasse oder das Objekt über die von uns erwartete Methode verfügt. Wenn nicht, wird das Problem der Sichtbarkeit hier nicht berücksichtigt. Wenn Sie also zufällig eine private oder geschützte Methode bestimmen, erhalten Sie möglicherweise eine korrekte Rückgabe, bei der Ausführung erhalten Sie jedoch eine Fehlermeldung „Schwerwiegender Fehler“.

Die eigentliche Absicht des obigen Codes sollte wie folgt verstanden werden: Können wir für die bereitgestellte Klasse oder das bereitgestellte Objekt die SomeMethod-Methode im aktuellen Bereich aufrufen? Und genau das ist der Zweck der is_callable()-Funktion. is_callable()Die Funktion erhält einen Callback-Parameter, der einen Funktionsnamen oder ein Array mit dem Methodennamen und dem Objekt angeben kann. Wenn sie im aktuellen Bereich ausgeführt werden kann, gibt sie TRUE zurück.

<?php
    if (is_callable(array($object, &#39;SomeMethod&#39;))) {      
        $object->SomeMethod($this, TRUE); 
    }
?>
Nach dem Login kopieren

Lassen Sie uns ein Beispiel geben, um den Unterschied zwischen den beiden zu veranschaulichen.

<?phpclass Foo {
    public function PublicMethod(){}    
    private function PrivateMethod(){}    
    public static function PublicStaticMethod(){}    
    private static function PrivateStaticMethod(){}
}
    $foo = new Foo();$callbacks = array(    
    array($foo, &#39;PublicMethod&#39;),    
    array($foo, &#39;PrivateMethod&#39;),    
    array($foo, &#39;PublicStaticMethod&#39;),    
    array($foo, &#39;PrivateStaticMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PublicMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PrivateMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PublicStaticMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PrivateStaticMethod&#39;),
   );
   foreach ($callbacks as $callback){
    var_dump($callback);
    var_dump(method_exists($callback[0], $callback[1]));
    var_dump(is_callable($callback));    
    echo str_repeat(&#39;-&#39;, 10);    
    echo &#39;<br />&#39;;
}
Nach dem Login kopieren

Nachdem wir das obige Skript ausgeführt haben, werden wir den Unterschied zwischen den beiden Funktionen deutlich erkennen.

is_callable() Es gibt andere Verwendungsmöglichkeiten, zum Beispiel nicht die bereitgestellte Klasse oder Methode zu überprüfen, sondern nur zu überprüfen, ob die Syntax der Funktion oder Methode korrekt ist. Wie method_exists() kann is_callable() das automatische Laden von Klassen auslösen.

Wenn ein Objekt eine magische Methode __call hat, gibt method_exists() FALSE und is_callable() TRUE zurück, wenn die Methode beurteilt wird.

<?phpclass MethodTest {
    public function __call($name, $arguments){
      echo &#39;Calling object method &#39; . $name . &#39; &#39; .implode(&#39;, &#39;, $arguments);      
      echo &#39;<br />&#39;;
    }
}$obj = new MethodTest();$obj->runtest(&#39;in object context&#39;);
var_dump(method_exists($obj,&#39;runtest&#39;));
var_dump(is_callable(array($obj,&#39;runtest&#39;)));

echo &#39;<br />&#39;;
Nach dem Login kopieren

Ergebnisse ausführen

Objektmethoden-Runtest im Objektkontext aufrufen
bool(false) bool(true)

Entdecken Sie die Funktionen is_callable() und method_exists() in PHP

In vielen Produktanwendungen sehen wir häufig die folgende Verwendung, mit der überprüft wird, ob eine Methode in einem Objekt vorhanden ist.

<?phpif (method_exists($object, &#39;SomeMethod&#39;)) {   
    $object->SomeMethod($this, TRUE); 
}?>
Nach dem Login kopieren

Der Zweck dieses Codes ist relativ einfach zu verstehen. Es gibt ein Objekt namens $object. Wir möchten wissen, ob es eine Methode namens SomeMethod hat.

Dieser Code sieht korrekt aus und wird die meiste Zeit einwandfrei funktionieren. Aber wenn die Methode dieses $object-Objekts für die aktuelle Ausführungsumgebung unsichtbar ist, kann das Programm dann trotzdem normal ausgeführt werden? So wie diese Funktionsnamensmethode existiert, prüft sie lediglich, ob die von uns bereitgestellte Klasse oder das Objekt über die von uns erwartete Methode verfügt. Wenn nicht, wird das Problem der Sichtbarkeit hier nicht berücksichtigt. Wenn Sie also zufällig eine private oder geschützte Methode bestimmen, erhalten Sie möglicherweise eine korrekte Rückgabe, bei der Ausführung erhalten Sie jedoch eine Fehlermeldung „Schwerwiegender Fehler“.

Die eigentliche Absicht des obigen Codes sollte wie folgt verstanden werden: Können wir für die bereitgestellte Klasse oder das bereitgestellte Objekt die SomeMethod-Methode im aktuellen Bereich aufrufen? Und genau das ist der Zweck der is_callable()-Funktion. is_callable()Die Funktion erhält einen Callback-Parameter, der einen Funktionsnamen oder ein Array mit dem Methodennamen und dem Objekt angeben kann. Wenn sie im aktuellen Bereich ausgeführt werden kann, gibt sie TRUE zurück.

<?php
    if (is_callable(array($object, &#39;SomeMethod&#39;))) {      
    $object->SomeMethod($this, TRUE); 
    }
?>
Nach dem Login kopieren

Lassen Sie uns ein Beispiel geben, um den Unterschied zwischen den beiden zu veranschaulichen.

<?php
    class Foo {
    public function PublicMethod(){}    
    private function PrivateMethod(){}    
    public static function PublicStaticMethod(){}    
    private static function PrivateStaticMethod(){}
}
$foo = new Foo();$callbacks = array(    
    array($foo, &#39;PublicMethod&#39;),    
    array($foo, &#39;PrivateMethod&#39;),    
    array($foo, &#39;PublicStaticMethod&#39;),    
    array($foo, &#39;PrivateStaticMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PublicMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PrivateMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PublicStaticMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PrivateStaticMethod&#39;),
   );
   foreach ($callbacks as $callback){
    var_dump($callback);
    var_dump(method_exists($callback[0], $callback[1]));
    var_dump(is_callable($callback));    
    echo str_repeat(&#39;-&#39;, 10);    
    echo &#39;<br />&#39;;
}
Nach dem Login kopieren

Nachdem wir das obige Skript ausgeführt haben, werden wir den Unterschied zwischen den beiden Funktionen deutlich erkennen.

is_callable() Es gibt andere Verwendungsmöglichkeiten, zum Beispiel nicht die bereitgestellte Klasse oder Methode zu überprüfen, sondern nur zu überprüfen, ob die Syntax der Funktion oder Methode korrekt ist. Wie method_exists() kann is_callable() das automatische Laden von Klassen auslösen.

Wenn ein Objekt eine magische Methode __call hat, gibt method_exists() FALSE und is_callable() TRUE zurück, wenn die Methode beurteilt wird.

<?phpclass MethodTest {
    public function __call($name, $arguments){
      echo &#39;Calling object method &#39; . $name . &#39; &#39; .implode(&#39;, &#39;, $arguments);      
      echo &#39;<br />&#39;;
    }
}
$obj = new MethodTest();$obj->runtest(&#39;in object context&#39;);
var_dump(method_exists($obj,&#39;runtest&#39;));
var_dump(is_callable(array($obj,&#39;runtest&#39;)));
echo &#39;<br />&#39;;
Nach dem Login kopieren

Ergebnisse ausführen

Objektmethoden-Runtest im Objektkontext aufrufen
bool(false) bool(true)

Entdecken Sie die Funktionen is_callable() und method_exists() in PHP

Das obige ist der detaillierte Inhalt vonEntdecken Sie die Funktionen is_callable() und method_exists() in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage