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.
<?phpif (method_exists($object, 'SomeMethod')) { $object->SomeMethod($this, TRUE); }?>
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.
<?phpif (is_callable(array($object, 'SomeMethod'))) { $object->SomeMethod($this, TRUE); }?>
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, 'PublicMethod'), array($foo, 'PrivateMethod'), array($foo, 'PublicStaticMethod'), array($foo, 'PrivateStaticMethod'), array('Foo', 'PublicMethod'), array('Foo', 'PrivateMethod'), array('Foo', 'PublicStaticMethod'), array('Foo', 'PrivateStaticMethod'), );foreach ($callbacks as $callback){ var_dump($callback); var_dump(method_exists($callback[0], $callback[1])); var_dump(is_callable($callback)); echo str_repeat('-', 10); echo '<br />'; }
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 'Calling object method ' . $name . ' ' .implode(', ', $arguments); echo '<br />'; } }$obj = new MethodTest();$obj->runtest('in object context'); var_dump(method_exists($obj,'runtest')); var_dump(is_callable(array($obj,'runtest')));echo '<br />';
Ergebnisse ausführen
Objektmethoden-Runtest im Objektkontext aufrufen
bool(false) bool(true)
Das obige ist der detaillierte Inhalt vonEinführung in die spezifischen Unterschiede zwischen den Funktionen is_callable() und method_exists() in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!