Was genau ist der Unterschied zwischen is_callable und function_exists in PHP?

Lesezeit: 3 Minuten

Benutzer-Avatar
Chetan Sharma

Ich arbeite an einem Projekt, in dem ich eine veraltete Funktion aus der älteren Version verwende. Aber ich möchte nicht, dass mein Skript stoppt, wenn es in der älteren Version verwendet wird.

Also überprüfe ich, ob die Funktion existiert und wenn nicht, dann erstelle sie.

Was ist der Unterschied zwischen function_exists und is_callable in PHP und welches ist besser zu verwenden?

if (!is_callable('xyz')) {
    function xyz() {
       // code goes here
    }
}

ODER

if(!function_exists('xyz')) {
    function xyz() {
      // code goes here
    }
}

Benutzer-Avatar
Artefakt

Die Funktion is_callable akzeptiert nicht nur Funktionsnamen, sondern auch andere Arten von Rückrufe:

  • Foo::method
  • array("Foo", "method")
  • array($obj, "method")
  • Closures und andere aufrufbare Objekte (PHP 5.3)

So is_callable akzeptiert alles, was Sie bestehen könnten call_user_func und Familie, während function_exists sagt nur, ob eine bestimmte Funktion existiert (keine Methoden, siehe method_exists dafür noch Schließungen).

Anders ausgedrückt, is_callable ist eine Hülle für zend_is_callabledas Variablen mit dem Pseudotyp-Callback behandelt, while function_exists tut nur a Hash-Tabellensuche in der Funktionstabelle.

  • In einem Fall das method ist eine öffentliche Methode von Foo und “Foo” ist nicht initialisiert, is_callable('Foo', 'method') ist zurückgekommen false während method_exists('Foo', 'method') ist zurückgekommen true. PS. Ich habe dies in a getestet foreach (get_declared_classes() as $class) Schleife.

    – ttvd94

    5. August 2021 um 16:08 Uhr


Bei Verwendung mit einer Funktion (nicht einer Klassenmethode) gibt es außer diesem keinen Unterschied function_exists ist etwas schneller.

Aber wenn Sie verwendet werden, um das Vorhandensein von Methoden in einer Klasse zu überprüfen kann nicht verwenden function_exists. Sie müssen verwenden is_callable oder method_exists.

Benutzer-Avatar
Yomi ojo

Bei Verwendung im Unterrichtskontext is_callable gibt true für Klassenmethoden zurück, auf die zugegriffen werden kann, dh öffentliche Methoden, aber method_exists gibt für alle Methoden „true“ zurück – öffentlich, geschützt und privat. function_exists macht dasselbe wie method_exists außerhalb des Klassenkontextes.

Benutzer-Avatar
Martin York

Wenn eine Funktion Plop existiert dann function_exists("Plop") wird wahr zurückgeben.

Sehen function_exists

Wenn eine Variable dann aufrufbar ist is_callable($var) wird wahr zurückgeben.
Das könnte jetzt bedeuten $var ist ein Funktionsname.
Aber ich könnte auch eine Kombination aus Objekt- und Methodenname sein.

Sehen is_callable

Noch eins anders:

Wenn Sie eine Klasse haben, die verwendet __call magische Methodedas is_callable($object, $method) wird immer für alles wahr zurückgeben, weil __call akzeptiert grundsätzlich jeden Methodennamen. Und wie Sie vielleicht schon wissen, method_exists gibt dafür false zurück, wenn die Methode nicht in der Klasse definiert ist.

Dies ist besonders ärgerlich, wenn Sie CakePHP verwenden Model Klasse, wie sie implementiert haben __call magische Methode, um magische Abfragen bereitzustellen, aber nicht cool, wenn Sie möchten, dass die Methode absolut definiert ist.

  • Ich habe diese Situation in Laravel erlebt

    – ymakux

    15. März 2020 um 9:04 Uhr

  • Ich habe diese Situation in Laravel erlebt

    – ymakux

    15. März 2020 um 9:04 Uhr

1299660cookie-checkWas genau ist der Unterschied zwischen is_callable und function_exists in PHP?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy