Affen-Patch im Namespace php> = 5.3
Eine weniger ausweichende Methode als das Ändern des Interpreters ist das Affenfeld.
Das Patchen von Affen ist die Kunst, die eigentliche Implementierung durch ein ähnliches "Patch" zu ersetzen.
Ninja-Fähigkeiten
Bevor Sie wie ein PHP-Ninja Affen-Patches erstellen können, müssen Sie zunächst die PHP-Namespaces verstehen.
Seit PHP 5.3 haben wir Namespaces kennengelernt, die Sie auf den ersten Blick als äquivalent zu Java-Paketen bezeichnen könnten, aber es ist nicht ganz dasselbe. Namespaces in PHP sind eine Möglichkeit, den Bereich zu kapseln, indem eine Fokushierarchie erstellt wird, insbesondere für Funktionen und Konstanten. Wie dieses Thema, Rückgriff auf globale Funktionen , zu erklären versucht.
Wenn Sie beim Aufrufen einer Funktion keinen Namespace angeben , sucht PHP zuerst im aktuellen Namespace und bewegt sich dann in der Hierarchie nach unten, bis die erste in diesem vorangestellten Namespace deklarierte Funktion gefunden und ausgeführt wird. Wenn Sie in unserem Beispiel print_r();
von namespace My\Awesome\Namespace;
PHP aus aufrufen , suchen Sie zuerst nach einer aufgerufenen Funktion My\Awesome\Namespace\print_r();
und My\Awesome\print_r();
dann, My\print_r();
bis die in PHP integrierte Funktion im globalen Namespace gefunden wird \print_r();
.
Sie können a function print_r($object) {}
im globalen Namespace nicht definieren, da dies zu einer Namenskollision führt, da bereits eine Funktion mit diesem Namen vorhanden ist.
Erwarten Sie einen schwerwiegenden Fehler wie:
Fatal error: Cannot redeclare print_r()
Nichts hindert Sie jedoch daran, genau das im Rahmen eines Namespace zu tun.
Den Affen flicken
Angenommen, Sie haben ein Skript mit mehreren print_r();
Aufrufen.
Beispiel:
<?php
print_r($some_object);
print_r($another_object);
print_r($data_object);
print_r($debug_object);
Aber Sie ändern später Ihre Meinung und möchten, dass die Ausgabe <pre></pre>
stattdessen in Tags eingeschlossen wird. Ist dir schon mal was passiert?
Bevor Sie loslegen und jeden Anruf ändern, sollten Sie print_r();
stattdessen das Patchen von Affen in Betracht ziehen.
Beispiel:
<?php
namespace MyNamespace {
function print_r($object)
{
echo "<pre>", \print_r($object, true), "</pre>";
}
print_r($some_object);
print_r($another_object);
print_r($data_object);
print_r($debug_object);
}
Ihr Skript wird jetzt MyNamespace\print_r();
anstelle des globalen Skripts verwendet\print_r();
Funktioniert hervorragend zum Verspotten von Unit-Tests.
nJoy!