function foo () {
global $var;
// rest of code
}
In meinen kleinen PHP-Projekten gehe ich normalerweise den prozeduralen Weg. Ich habe im Allgemeinen eine Variable, die die Systemkonfiguration enthält, und wenn ich in einer Funktion auf diese Variable zugreifen möchte, tue ich dies global $var;
.
Ist das eine schlechte Praxis?
php
global-variables
global
KRTac
quelle
quelle
Antworten:
Wenn Menschen über globale Variablen in anderen Sprachen sprechen, bedeutet dies etwas anderes als in PHP. Das liegt daran, dass Variablen in PHP nicht wirklich global sind. Der Umfang eines typischen PHP-Programms ist eine HTTP-Anforderung. Sitzungsvariablen haben tatsächlich einen größeren Umfang als "globale" PHP-Variablen, da sie normalerweise viele HTTP-Anforderungen umfassen.
Oft (immer?) Können Sie Mitgliedsfunktionen mit folgenden Methoden aufrufen
preg_replace_callback()
:Weitere Informationen finden Sie unter Rückrufe .
Der Punkt ist, dass Objekte mit PHP verschraubt wurden und in gewisser Weise zu Unbeholfenheit führen.
Kümmern Sie sich nicht zu sehr darum, Standards oder Konstrukte aus verschiedenen Sprachen auf PHP anzuwenden. Eine weitere häufige Gefahr besteht darin, PHP in eine reine OOP-Sprache umzuwandeln, indem Objektmodelle auf alles geklebt werden.
Verwenden Sie wie alles andere "globale" Variablen, prozeduralen Code, ein bestimmtes Framework und OOP, da dies sinnvoll ist, ein Problem löst, die Menge an Code reduziert, die Sie schreiben müssen, oder es wartbarer und verständlicher macht, nicht weil Sie denken Du solltest.
quelle
array ($obj, 'callbackMethod')
bei Anrufen an verwendenpreg_replace_callback()
? (Ich weiß, ich bin dieser OOP-Wenn globale Variablen nicht sorgfältig verwendet werden, kann es schwieriger werden, Probleme zu finden. Angenommen, Sie fordern ein PHP-Skript an und erhalten eine Warnung, dass Sie versuchen, auf einen Index eines Arrays zuzugreifen, der in einer Funktion nicht vorhanden ist.
Wenn das Array, auf das Sie zugreifen möchten, lokal für die Funktion ist, überprüfen Sie die Funktion, um festzustellen, ob Sie dort einen Fehler gemacht haben. Möglicherweise liegt ein Problem mit einer Eingabe in die Funktion vor, sodass Sie die Stellen überprüfen, an denen die Funktion aufgerufen wird.
Wenn dieses Array jedoch global ist, müssen Sie alle Stellen überprüfen, an denen Sie diese globale Variable verwenden, und nicht nur das, sondern auch herausfinden, in welcher Reihenfolge auf diese Verweise auf die globale Variable zugegriffen wird.
Wenn Sie eine globale Variable in einem Code haben, ist es schwierig, die Funktionalität dieses Codes zu isolieren. Warum sollten Sie die Funktionalität isolieren wollen? Sie können es also testen und an anderer Stelle wiederverwenden. Wenn Sie Code haben, den Sie nicht testen und nicht wiederverwenden müssen, ist die Verwendung globaler Variablen in Ordnung.
quelle
Ich stimme Cletus zu. Ich würde zwei Dinge hinzufügen:
Mit freundlichen Grüßen, don
quelle
$DB = 'foo';
Wer kann gegen Erfahrung, Hochschulabschlüsse und Software-Engineering argumentieren? Nicht ich. Ich würde nur sagen, dass ich bei der Entwicklung objektorientierter PHP-Anwendungen für einzelne Seiten mehr Spaß habe, wenn ich weiß, dass ich das Ganze von Grund auf neu erstellen kann, ohne mir Gedanken über Namespace-Kollisionen machen zu müssen. Von Grund auf neu zu bauen ist etwas, was viele Menschen nicht mehr tun. Sie haben einen Job, eine Frist, einen Bonus oder einen Ruf, um den sie sich kümmern müssen. Diese Typen verwenden in der Regel so viel vorgefertigten Code mit hohen Einsätzen, dass sie nicht riskieren können, überhaupt globale Variablen zu verwenden.
Es mag schlecht sein, globale Variablen zu verwenden, auch wenn sie nur im globalen Bereich eines Programms verwendet werden. Vergessen wir jedoch nicht diejenigen, die einfach nur Spaß haben und etwas zum Laufen bringen möchten .
Wenn dies bedeutet, dass einige Variablen (<10) im globalen Namespace verwendet werden, werden diese nur im globalen Bereich eines Programms verwendet. Ja, ja, MVC, Abhängigkeitsinjektion, externer Code, bla, bla, bla, bla. Wenn Sie jedoch 99,99% Ihres Codes in Namespaces und Klassen enthalten haben und externer Code in einer Sandbox gespeichert ist, endet die Welt nicht (ich wiederhole, die Welt endet nicht), wenn Sie eine globale Variable verwenden.
Im Allgemeinen würde ich nicht sagen, dass die Verwendung globaler Variablen eine schlechte Praxis ist . Ich würde sagen, dass die Verwendung globaler Variablen (Flags und dergleichen) außerhalb des globalen Bereichs eines Programms Probleme bereitet und (auf lange Sicht) schlecht beraten ist, da Sie den Überblick über ihre Zustände ziemlich leicht verlieren können. Außerdem würde ich sagen, je mehr Sie lernen, desto weniger sind Sie auf globale Variablen angewiesen , da Sie die "Freude" erlebt haben, Fehler aufzuspüren, die mit ihrer Verwendung verbunden sind. Dies allein wird Sie dazu anregen, einen anderen Weg zu finden, um dasselbe Problem zu lösen. Zufälligerweise führt dies dazu, dass PHP-Benutzer lernen, wie man Namespaces und Klassen (statische Mitglieder usw.) verwendet.
Das Gebiet der Informatik ist riesig. Wenn wir alle davon abhalten, etwas zu tun, weil wir es als schlecht bezeichnen , verlieren sie den Spaß daran, die Gründe für das Etikett wirklich zu verstehen.
Verwenden Sie gegebenenfalls globale Variablen, aber prüfen Sie dann, ob Sie das Problem ohne sie lösen können. Kollisionen, Tests und Debugging bedeuten mehr, wenn Sie die wahre Natur des Problems genau verstehen, nicht nur eine Beschreibung des Problems.
quelle
Wir können dieses Problem mit dem folgenden Pseudocode veranschaulichen
Ihre erste Frage hier ist offensichtlich
Bist du verwirrt? Gut. Sie haben gerade erfahren, warum Globals verwirrend sind und als schlechte Praxis angesehen werden. Wenn dies ein echtes Programm wäre, besteht Ihr nächster Spaß darin, alle Instanzen aufzuspüren
$bob
und zu hoffen, dass Sie das richtige finden (dies wird schlimmer, wenn$bob
es überall verwendet wird). Schlimmer noch, wenn jemand anderes$bob
diese Variable definiert (oder Sie diese Variable vergessen und wiederverwendet haben), kann Ihr Code beschädigt werden (im obigen Codebeispiel würde ein falsches Objekt oder gar kein Objekt einen schwerwiegenden Fehler verursachen). Da praktisch alle PHP-Programme Code wieinclude('file.php');
Ihren Job verwenden, wird die Verwaltung von Code wie diesem exponentiell schwieriger, je mehr Dateien Sie hinzufügen.Wie vermeiden wir Globals?
Der beste Weg, um Globals zu vermeiden, ist eine Philosophie namens Dependency Injection . Hier übergeben wir die benötigten Werkzeuge an die Funktion oder Klasse.
Dies ist viel einfacher zu verstehen und zu pflegen. Es gibt keine Vermutung, wo
$bob
eingerichtet wurde, da der Anrufer dafür verantwortlich ist, dies zu wissen (er übergibt uns das, was wir wissen müssen). Besser noch, wir können Typdeklarationen verwenden, um die Übergabe einzuschränken. Wir wissen also, dass dies$bob
entweder eine Instanz derBar
Klasse oder eine Instanz eines Kindes von istBar
, was bedeutet, dass wir wissen, dass wir die Methoden dieser Klasse verwenden können. In Kombination mit einem Standard-Autoloader (verfügbar seit PHP 5.3) können wir jetzt nachverfolgen, woBar
definiert ist. PHP 7.0 oder höher enthält erweiterte Typdeklarationen, in denen Sie auch skalare Typen (wieint
oderstring
) verwenden können.quelle
$bob = Bar::instance();
wann immer Sie es brauchen.Wie:
ist eine schlechte Praxis (wie Wordpress
$pagenow
) ... hmmmBetrachten Sie dies:
ist PHP-Fehler Aber:
ist KEIN Fehler, Hypens kollidieren nicht mit "allgemeinen" vom Benutzer deklarierten Variablen wie
$pagenow
. Die Verwendung von UPPERCASE weist auf eine Superglobalität hin, die verwendet wird, leicht im Code zu erkennen ist oder mit der Suche in Dateien verfolgt wirdIch benutze Bindestriche, wenn ich faul bin, Klassen von allem für eine einzige Lösung zu erstellen, wie:
Aber in Fällen einer breiteren Verwendung verwende ich EIN Globale als Array:
Letzteres ist für mich eine gute Praxis für "Cola Light" -Objektive oder -Verwendung, anstatt jedes Mal mit Singleton-Klassen zu überladen, um einige Daten "zwischenzuspeichern". Bitte machen Sie einen Kommentar, wenn ich falsch liege oder etwas Dummes hier vermisse ...
quelle