2016-12-14 6 views
0

Dies ist wahrscheinlich Grundkenntnisse, aber ich bin kein ausgebildeter Entwickler, also ertragen Sie mit mir.Globale Instanz der Klasse in PHP

Meine Frage ist: Wie kann ich eine Klasse in PHP "global" bekommen, so dass ich es außerhalb eines Funktionsaufrufs initialisieren kann, aber es immer noch innerhalb verwenden?

Dieses Beispiel zeigt, was ich erreichen will, aber funktioniert offenbar nicht:

$view = new Smarty(); 

$view->debugging = false; 
$view->caching = false; 
$view->cache_lifetime = 1; 
$view->setTemplateDir('../views/'); 

$app->get('/register', function (Request $request, Response $response) {  
    $param = $request->getParams(); 

    $view->assign('name', $param["name"]); 
    $response = $view->display('index.html'); 

    return $response; 
}); 

es Ich habe zu definieren es im $ app-> erhalten rufen zur Arbeit zu kommen. Dann muss natürlich auch $ view-> debugging etc innerhalb des $ app-> get call gesetzt werden.

Der Zweck ist, zu vermeiden, eine neue Instanz von $ view für jeden Aufruf zu initialisieren und die Standardeinstellungen global zu erhalten.

Edit: Vielleicht war ich zu schnell die Frage hier zu stellen. Nach einer Google-Suche könnte ich die Lösung finden. Aber mit "global $ view" innerhalb der Funktion bekomme ich Zugriff auf die Instanz der Klasse. Dies unterscheidet sich von anderen Sprachen, in denen Sie "public $ variable = new class.function()" setzen, aber es gibt wahrscheinlich einen Grund dafür, und ich kann definitiv sehen, wie dies ein Vorteil für die Sicherheit/Leistung usw. sein kann Gibt es einen alternativen Weg? Was sind die Vor-/Nachteile?

Antwort

2

Die Verwendung globaler Variablen wird nicht als bewährte Methode betrachtet. Es macht Code, der sehr schwierig zu testen ist. Siehe Why is Global State so Evil? Sie wollen in der Regel Dependency Injection tun:

function doSomething($obj) 
{ 
    // code here 
} 

$foo = new MyClass(); 
doSomething($foo); 

Natürlich, die schwierig sein kann, wenn man mit einem potenziell opinionated Rahmen arbeiten.

Eine bessere Lösung in Ihrem Fall ist the use keyword zu verwenden, um die Variable aus dem lokalen Bereich anstelle des globalen Bereichs zu erben, wie in:

$app->get('/register', function (Request $request, Response $response) use ($view) { 
    $param = $request->getParams(); 

    $view->assign('name', $param["name"]); 
    $response = $view->display('index.html'); 

    return $response; 
}); 

Wenn Sie ein globalen verwenden müssen, sondern nur die Verwendung global Stichwort:

0

In diesem speziellen Fall würden Sie einen Verschluss, wie folgt verwenden:

$app->get('/register', function (Request $request, Response $response) 
    use ($view) { 
    // ... code ... $view is defined here 
} 

Sie können außerdem durch Verweis aufrufe (das heißt use (&$view)) in der Lage sein, um die Variable in dem Verschluss Umfang zu ändern.

Siehe Dokumentation im PHP-Handbuch: http://php.net/manual/en/functions.anonymous.php.