Entfernen einer Funktion, die zur Laufzeit in PHP (ohne die runkit-Erweiterung)
Ich weiß, diese Frage scheint hacky und seltsam, aber gibt es eine Möglichkeit zu entfernen, eine Funktion, die zur Laufzeit in PHP?
Ich habe eine rekursive Funktion deklariert, in einem "wenn" - block und möchten, dass diese Funktion "gültig", nur in diesem "wenn" - block. Ich will nicht, diese Funktion zu callled außerhalb dieses Blocks.
Fand ich heraus, runkit_function_remove aber runkit ist nicht aktiviert auf meinem Web-host. Gibt es einen anderen Weg, das zu tun?
BTW ich habe nur die Unterstützung von PHP 5.1.0.
Edit: ich wusste, dass meine Frage war, hacky, aber hier ist die genaue Sache, die ich tun will:
if (function_exists('get_magic_quotes_gpc') && @get_magic_quotes_gpc())
{
function stripslashes_deep($value)
{
return is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value);
}
$_POST = array_map('stripslashes_deep', $_POST);
$_GET = array_map('stripslashes_deep', $_GET);
$_COOKIE = array_map('stripslashes_deep', $_COOKIE);
$_REQUEST = array_map('stripslashes_deep', $_REQUEST);
//runkit_function_remove('stripslashes_deep');
}
Da "stripslashes_deep" nur live, wenn Magic Quotes AN sind, ich wollte es loswerden, wenn ich fertig bin mit ihm. Ich will nicht Menschen zu verlassen auf eine Funktion, die nicht immer es. Ich hoffe es ist klarer jetzt. Nicht-hacky Lösung Vorschläge sind auch willkommen!
- Jeder Grund, warum Sie nicht einfach nur nennen Sie es nicht?
- Rufen Sie nicht, was?
- Seien Sie vorsichtig! Array-keys sind auch gekürzt durch magic quotes.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus der PHP-Handbuch auf Funktionen:
Ausnahme ist durch runkit. Allerdings könnten Sie Ihre Funktion als anonyme Funktion und
unset
es, nachdem Sie es lief, z.B.Einige commentors richtig hingewiesen (aber kein Thema mehr in PHP heutzutage), können Sie nicht an eine anonyme Funktion in sich. Durch die Verwendung
array_walk_recursive
können Sie umgehen diese Einschränkung. Ich persönlich würde nur um eine normale Funktion und nicht die Mühe, über ihn zu löschen. Es wird nicht jemand verletzt. Nur geben Sie einen geeigneten Namen, wiestripslashes_gpc_callback
.Hinweis: bearbeitet und verdichtet, nachdem Kommentare
$foo = function () use (&$foo) { $foo(); }
Ab PHP 5.3 können Sie eine anonyme Funktion:
Nennen mag:
Um die Funktion zu löschen, einfach unset variable:
Hier ist ein Beispiel, wie man implementieren Sie die Funktion:
anonyme Funktionen, die keinen Namen hat. So können Sie nicht verwenden array_map, da es dauert nur ein Funktionsname als parameter.
anonyme Funktionen hat den Gültigkeitsbereich der Variablen. So müssen Sie deklarieren die variable, die die Funktion als global zu erreichen, es in eine rekursive Funktion.
Leider, wenn Sie definieren eine normale Funktion innerhalb der anonymen Funktion, wird es weltweit verfügbar, auch nachdem Sie unset die variable. (Sehe ich nicht wirklich den Vorteil, dass. Ich hoffe, dass es ein Fehler korrigiert werden, später 🙂
stripslashes_deep
.Einfache Antwort: Nein.
Jedoch Sie können versuchen, indem die Funktion in einem namespace, eine Klasse oder sogar die innerhalb einer anderen Funktion - aber ich denke, das ist nicht, was Sie suchen.
Einer anderen option, die Sie haben zu verwenden
debug_backtrace()
innerhalb der besagten Funktion, um zu überprüfen, welche Datei /Zeile /etc... ruft es - und es ist hackish ich weiß, aber so istrunkit_function_remove()
.Bearbeiten - schade, dass Sie nicht ausführen, PHP 5.3+, sonst könnte man es einfach tun:
Für ältere PHP-Versionen haben Sie immer noch diese option:
Keine Funktionen gibt, und der code ist noch nicht so lange. =)
Anfängliche definition einer Funktion sieht wie folgt aus:
wenn Sie eine test-Bedingung erlaubt, dass Sie die rewrite-code:
wenn du eine überlastung in einem anderen enthalten, die geladen wird, bevor oder nachdem die original-Datei:
Nicht. Aber das entfernen einer Funktion definition ist albern.
Entweder Sie definieren die Funktion anders als bei einem
else
blockieren und müssen die definition zu ändern, basierend auf dem Zustand des Programms, effektiv so dass Ihr Projekt näher und näher an unmöglich zu Debuggen, oder den code zum aufrufen der Funktion wird die crash-und brennen, wenn es nicht zufällig definierten Laufzeit.Sollte man diese Funktion in eine Klasse:
oder, wenn Sie wollen nur den Zustand mal getestet,
Ich weiß nicht, was Sie versuchen zu tun oder warum Sie möchten, entfernen Sie die definition einer Funktion, aber hoffentlich kann Ihnen helfen, tun es in eine sauberere Möglichkeit.
Ich zu sehen, sehr wenig Grund, lassen Sie eine Funktion "live" oder nicht "live", je nach Zustand, aber um die Frage zu beantworten, ist es irgendwie möglich mit anonymen Funktionen. @Gordon bereits beschrieben, wie es gemacht wird. Beginnend mit PHP 5.3.0, können Sie auch anonyme Funktionen wie folgt. (Es gibt keinen funktionalen Unterschied zu den
create_function()
Ansatz.)array_map('stripslashes_deep', $value)
Arbeit?! Trotzdem, für PHP 5.3+ es gibt eine elegantere Lösung - siehe meine Antwort.Es ist unmöglich, ohne runkit_function_remove. Runkit ist die Erweiterung gedacht, um Dinge wie diese.
Sind Sie sicher, dass die Funktion Leben nach dem if-block beendet ist? Ich hätte gedacht, dass, wenn es definiert wurden, innerhalb der wenn-block, es würde nicht mehr zugegriffen werden danach.
if
Aussagen nicht über Ihren eigenen Bereich.Stimme ich mit Alix. Sie können, vermeiden Sie es jedoch, die Funktion, die aufgerufen wird, von irgendwo anders loszuwerden, indem Sie die Funktion aus. Schreiben Sie die rekursive Funktion als eine iterative Schleife. Sie haben den zusätzlichen Vorteil, die Speichernutzung zu reduzieren.
UPDATE: mit deinem code-Beispiel, ich bin nicht sicher, warum Sie das Bedürfnis verspüren, dies zu verhindern-Funktion wird erneut aufgerufen. Er formatiert einfach einige Zeichenfolgen in ein array rekursiv... wieder, Sie könnten dies tun iterativ und vermeiden, dass eine Funktion in den ersten Platz. Ansonsten, lassen Sie einfach es dort, und nennen Sie es nicht wieder.
Gibt es vielleicht eine andere Lösung für das ersetzen der Funktionen durch ändern Verwendung Sie wie diese ;
Vielleicht ist dies nicht für Sie in dieser situation, wie Sie wollten, zu zerstören, die Funktion, aber ich dachte es ist der richtige Ort, um zu sprechen über den Ersatz der Funktionen.