PHP: "Global" Zählen
Aktuelle situation:
- Ich habe die aktuelle version von meinem MVC-Framework, das verwendet Klassen als Controller.
- Ich habe einige "vintage" - Module von meinem alten MVC-Framework, welches mit einfachen, flachen enthält als Controller.
Sehr vereinfacht heißt das:
Neue Version:
<?PHP
class blaController extends baseController {
private $intVar;
function dosomethingFunction() {
$this->intVar = 123;
$this->view('myView');
}
}
?>
Alte Version:
<?PHP
$globalVar = 123;
//view "controllername" is automatically shown
?>
Ich bin jetzt versucht, zu schreiben eine wrapper nutzen zu können, mein Alter Controller in meinem neuen MVC, ohne alles umschreiben. Dazu habe ich eine "wrapper" - controller:
class wrapController extends baseController {
function dosomethingFunction() {
require 'old_dosomething.function.php';
$this->view('old_dosomething_view');
}
}
(Noch einmal: Das ist sehr, SEHR vereinfacht - nur auf die Idee kommen über. Nicht die tatsächlichen code.)
Das problem bei diesem Ansatz ist, dass die bisher Globale variable $globalVar jetzt existiert nur innerhalb der Methode "dosomethingFunction" kann nicht zugegriffen werden, indem die view.
Wäre dies nicht der Fall sein, wenn ich erzwingen könnte, das verlangen, sich zu Verhalten wie "im globalen Rahmen" so an, dass $globalVar würde wieder verfügbar sein, im globalen Rahmen.
Also: gibt es eine Möglichkeit, Sie zu erreichen "require_global" oder etwas ähnliches?
(Eine Lösung für mein problem wäre zu ändern, meinen alten Controller, mit zu beginnen eine Reihe von "globalen" Befehle, aber ich würde lieber eine Lösung, wo ich nicht so sehr verändern, dass der alte code.)
(Hinweis: Bitte erzählen Sie mir nicht, dass die GLOBALS sind schlecht. Es ist völlig verfehlt den Punkt dieser Frage. Einfach akzeptieren, dass es ist eine Anforderung, halten einige alte code funktioniert in einer neueren, saubereren Umwelt.)
InformationsquelleAutor BlaM | 2009-04-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie lokale Variablen innerhalb von dosomethingFunction() global scope:
Beachten Sie, dass für diese wie erwartet funktionieren, sollten Sie anrufen, bevor Sie die Verwendung einer anderen Sache in der Funktion. get_defined_vars() gibt nur Variablen aus dem aktuellen Bereich, also keine array_diff hacks benötigt werden.
naja, $GLOBAL ist nicht wirklich "normalen" array. Rollback mit der foreach-version.
InformationsquelleAutor vartec
Dies ist die einfachste Lösung, die ich denken kann.
Verwenden Sie die get_defined_vars () - Funktion zweimal und erhalten eine diff von jedem Anruf, um zu bestimmen, welche Variablen, die eingeführt wurden, indem Sie die gewünschte Datei aus.
Beispiel:
Guter Punkt. Obwohl es sicherlich möglich, dass jemand später fügt Variablen an diese Funktion.
array_diff_assoc schlägt fehl, wenn eine der Variablen ein Objekt, das nicht in eine Zeichenfolge konvertiert werden.
aber wenn Sie rufen Sie get_defined_vars (), bevor weitere Variablen Hinzugefügt werden, Sie erhalten Sie nur diejenigen, die von der Datei enthalten.
InformationsquelleAutor Matt
Hmmm, das ist eine Frage, die ich noch nie gesehen. Ich nehme an, Sie könnten dies tun
Aber das ist eine ziemlich zeitaufwändige, manuelle Prozess als auch, je nachdem, wie viele globals wir reden. Ich werde darüber nachdenken, aber ich kenne kein "auto-magic" - Lösung aus der Spitze von meinem Kopf.
InformationsquelleAutor Peter Bailey
Für Interessierte: Meine (bisher) Letzte version:
Hässlich, aber es funktioniert. Vielen Dank für Ihre großartige Hilfe!
InformationsquelleAutor BlaM
Haben Sie versucht Zend_Registry vom Zend Framework?
Die registry ist ein container für das speichern von Objekten und Werten im Raum der Anwendung. Durch das speichern der Werte in der registry steht das selbe Objekt immer verfügbar in der gesamten Anwendung. Dieser Mechanismus ist eine Alernative zur Verwendung eines globalen Speichers.
http://framework.zend.com/manual/en/zend.registry.html
... und ich sehe nicht, wie Zend_Registry ist besser als eine einfache Globale array zu speichern Zeug...
InformationsquelleAutor