Frage

Aktuelle Situation:

  • Ich habe die aktuelle Version meinen MVC-Framework, die Klassen als Controller verwendet.
  • Ich habe einige "vintage" Module von meinem alt MVC-Framework, die einfach verwendet, flach enthält als Controller.

Viel vereinfacht bedeutet das:

Neue Version:

<?PHP
class blaController extends baseController {
    private $intVar;

    function dosomethingFunction() {
        $this->intVar = 123;
        $this->view('myView');
    }
}
?>

Alt Version:

<?PHP
$globalVar = 123;
// view "controllername" is automatically shown
?>

Ich versuche jetzt einen Wrapper zu schreiben, dass ich meine alten Controller in meinem neuen MVC verwenden, ohne alles neu zu schreiben. 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 über die Idee zu bekommen Nicht eigentlichen Code)

Das Problem mit diesem Ansatz ist, dass die zuvor globale Variable $ globalVar jetzt nur innerhalb der Methode „dosomethingFunction“ existiert und nicht durch die Ansicht zugegriffen werden kann.

Dies wäre nicht der Fall sein, wenn ich das als „in global scope“ zu verhalten zwingen könnte erfordern, so dass $ globalVar würde wieder einmal in globalen Bereich zur Verfügung.

Also: Gibt es irgendeine Art und Weise " require_global " oder etwas ähnliches zu erreichen

?

(Eine Lösung für mein Problem wäre meine alten Controller ändern mit einem Bündel von „global“ Kommandos zu starten, aber ich würde eine Lösung bevorzugen, wo ich muß so von dem alten Code nicht viel ändern.)

(Anmerkung:... Bitte sagen Sie mir nicht, dass GLOBALS schlecht ist es völlig verfehlt den Sinn dieser Frage einfach akzeptieren, dass es eine Anforderung ist, einigen alten Code arbeitet in einer neueren, sauberere Umwelt zu halten)

War es hilfreich?

Lösung

Sie können lokale Variablen hinzufügen innerhalb dosomethingFunction definiert (), um globale Reichweite:

class wrapController extends baseController {
    function dosomethingFunction() {
        require 'old_dosomething.function.php';
        //begin added code  
        $vararr = get_defined_vars();
        foreach($vararr as $varName => $varValue) 
              $GLOBALS[$varName] = $varValue;            
        //end added code          
        $this->view('old_dosomething_view');
    }
}

Beachten Sie, dass für diese wie erwartet funktionieren, sollten Sie, bevor Sie eine andere Sache in der Funktion erfordern nennen. get_defined_vars () gibt nur Variablen aus dem aktuellen Bereich, so werden keine array_diff Hacks benötigt.

Andere Tipps

Dies ist die einfachste Lösung, die ich denken kann.

Mit den get_defined_vars () Funktion zweimal und einen Diff jeden Anruf erhalten, um zu bestimmen, welche Variablen durch die gewünschte Datei eingeführt wurde.

Beispiel:

$__defined_vars       = get_defined_vars();
require('old_dosomething.function.php');
$__newly_defined_vars = array_diff_assoc($__defined_vars, get_defined_vars());
$GLOBALS = array_merge($GLOBALS, $__newly_defined_vars);
$this->view('old_dosomething_view');

Hmmm, das ist eine Frage, die ich noch nie zuvor gesehen. Ich nehme an, Sie könnten dies tun

class wrapController extends baseController {
    function dosomethingFunction() {
        require 'old_dosomething.function.php';

        // Force "old" globals into global scope
        $GLOBALS['globalVar'] = $globalVar;

        $this->view('old_dosomething_view');
    }
}

Aber das ist ein ziemlich mühsamer, manueller Prozess als auch, je nachdem, wie viele Globals wir redeten. Ich werde darüber nachdenken, aber ich weiß nicht jede „Auto-Magie“ Lösung aus der Spitze von meinem Kopf.

Für alle interessiert: Meine (bisher) letzte Version:

class wrapController extends baseController {
    function dosomethingFunction() {
        // ... do some initialisation stuff ...

        $__defined_vars = array_keys(get_defined_vars());

        require 'old_dosomething.function.php';

        $__newly_defined_vars = array_diff(
                                    array_keys(get_defined_vars()),
                                    $__defined_vars, 
                                    array('__defined_vars')
                                );
        foreach ($__newly_defined_vars as $var) {
            $GLOBALS[$var] = &$$var;
        }

        $this->view('old_dosomething_view');
    }
}

Hässlich, aber es funktioniert. Vielen Dank für Ihre große Hilfe!

Haben Sie Zend_Registry von Zend Framework versucht?

Die Registry ist ein Container für Objekte und Werte in der Anwendung Raum zu speichern. Durch den Wert in der Registrierung speichert, ist das gleiche Objekt in Ihrer Anwendung immer verfügbar. Dieser Mechanismus ist eine Alternative zur Verwendung von globalen Speicher.

http://framework.zend.com/manual/en/zend .registry.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top