Hinweis: Dies ist eine Referenzfrage zum Umgang mit dem variablen Bereich in PHP. Bitte schließen Sie eine der vielen Fragen, die zu diesem Muster passen, als Duplikat dieser Frage.
Was ist "variabler Bereich" in PHP? Sind Variablen aus einer .php-Datei in einer anderen zugänglich? Warum erhalte ich manchmal Fehler "undefinierte Variable" ?
Antworten:
Was ist "variabler Bereich"?
Variablen haben einen begrenzten "Umfang" oder "Orte, von denen aus sie zugänglich sind". Nur weil Sie schrieb
$foo = 'bar';
einmal irgendwo in der Anwendung bedeutet nicht , dass Sie sich beziehen können$foo
von überall sonst in der Anwendung. Die Variable$foo
hat einen bestimmten Bereich, in dem sie gültig ist, und nur Code im selben Bereich hat Zugriff auf die Variable.Wie ist ein Bereich in PHP definiert?
Sehr einfach: PHP hat Funktionsumfang . Dies ist die einzige Art von Bereichstrennzeichen, die in PHP vorhanden ist. Variablen innerhalb einer Funktion sind nur innerhalb dieser Funktion verfügbar. Variablen außerhalb von Funktionen sind überall außerhalb von Funktionen verfügbar, jedoch nicht innerhalb einer Funktion. Dies bedeutet, dass es in PHP einen speziellen Bereich gibt: den globalen Bereich. Jede außerhalb einer Funktion deklarierte Variable liegt in diesem globalen Bereich.
Beispiel:
$foo
befindet sich im globalen Bereich,$baz
befindet sich in einem lokalen Bereich innerhalbmyFunc
. Nur Code im InnerenmyFunc
hat Zugriff auf$baz
. Nur Code außerhalbmyFunc
hat Zugriff auf$foo
. Keiner hat Zugang zum anderen:Umfang und enthaltene Dateien
Dateigrenzen trennen den Bereich nicht:
a.php
b.php
Für
include
d-Code gelten dieselben Regeln wie für jeden anderen Code: nur derfunction
separate Bereich. Zum Zwecke des Gültigkeitsbereichs können Sie Dateien wie das Kopieren und Einfügen von Code einschließen:c.php
Im obigen Beispiel
a.php
wurde darin enthaltenmyFunc
, dass alle darin enthaltenen Variablena.php
nur einen lokalen Funktionsumfang haben. Nur weil sie im globalen Bereich zu sein scheinen ,a.php
heißt das nicht unbedingt, dass sie es sind, sondern es hängt tatsächlich davon ab, in welchem Kontext dieser Code enthalten ist / ausgeführt wird.Was ist mit Funktionen innerhalb von Funktionen und Klassen?
Jede neue
function
Erklärung führt einen neuen Geltungsbereich ein, so einfach ist das.(anonyme) Funktionen innerhalb von Funktionen
Klassen
Wofür ist der Umfang gut?
Der Umgang mit Scoping-Problemen mag ärgerlich erscheinen, aber ein begrenzter variabler Umfang ist für das Schreiben komplexer Anwendungen unerlässlich! Wenn jede von Ihnen deklarierte Variable von überall in Ihrer Anwendung verfügbar wäre, würden Sie Ihre Variablen schrittweise durchlaufen, ohne wirklich nachverfolgen zu können, was was ändert. Es gibt nur so viele sinnvolle Namen, die Sie Ihren Variablen geben können, dass Sie die Variable "
$name
" wahrscheinlich an mehr als einer Stelle verwenden möchten . Wenn Sie diesen eindeutigen Variablennamen nur einmal in Ihrer App haben könnten, müssten Sie auf wirklich komplizierte Benennungsschemata zurückgreifen, um sicherzustellen, dass Ihre Variablen eindeutig sind und Sie nicht die falsche Variable aus dem falschen Code ändern.Beobachten:
Was würde die obige Funktion tun, wenn es keinen Bereich gäbe? Woher kommt
$bar
das? Welchen Zustand hat es? Ist es überhaupt initialisiert? Müssen Sie jedes Mal überprüfen? Dies ist nicht wartbar. Was uns zu ...Bereichsgrenzen überschreiten
Der richtige Weg: Variablen ein- und ausgeben
Die Variable
$bar
kommt explizit als Funktionsargument in diesen Bereich. Wenn man sich diese Funktion ansieht, ist klar, woher die Werte stammen, mit denen sie arbeitet. Es dann explizit zurückgibt einen Wert. Der Aufrufer hat das Vertrauen zu wissen, mit welchen Variablen die Funktion arbeitet und woher ihre Rückgabewerte stammen:Erweiterung des Variablenbereichs auf anonyme Funktionen
Die anonyme Funktion schließt explizit
$foo
aus ihrem umgebenden Bereich ein. Beachten Sie, dass dies nicht mit dem globalen Bereich identisch ist .Der falsche Weg:
global
Wie bereits erwähnt, ist der globale Bereich etwas Besonderes, und Funktionen können explizit Variablen daraus importieren:
Diese Funktion verwendet und ändert die globale Variable
$foo
. Mach das nicht! (Es sei denn, Sie wissen wirklich wirklich wirklich wirklich, was Sie tun, und selbst dann: nicht!)Der Aufrufer dieser Funktion sieht lediglich Folgendes:
Es gibt keinen Hinweis darauf, dass diese Funktion Nebenwirkungen hat , dies ist jedoch der Fall. Dies wird sehr leicht zu einem Durcheinander, da einige Funktionen ständig geändert werden und einen globalen Status erfordern . Sie möchten, dass Funktionen zustandslos sind , nur auf ihre Eingaben reagieren und definierte Ausgaben zurückgeben, wie oft Sie sie auch aufrufen.
Sie sollten es vermeiden, den globalen Bereich so weit wie möglich zu verwenden. Mit Sicherheit sollten Sie keine Variablen aus dem globalen Bereich in einen lokalen Bereich "ziehen".
quelle
global
gesagt , also sagen Sie uns bitte, wann wir verwenden sollenglobal
. Und bitte erklären Sie (ein bisschen) was iststatic
..?global
. Es ist immer falsch. Das Übergeben von Funktionsparametern ist richtig.static
wird im Handbuch gut erklärt und hat nicht viel mit Umfang zu tun. Kurz gesagt, es kann als "globale Variable mit Gültigkeitsbereich" betrachtet werden. Ich werde die Verwendung hier kunststube.net/static etwas erweitern .include_once
und möglicherweiserequire_once
auch irgendwo hinzugefügt werden sollte; nur sagen. OP stimmte dafür, ihre Frage ebenfalls erneut zu eröffnen. Wäre ihr Beitrag ein Sonderfall und was sollte dagegen getan werden?Obwohl auf Variablen, die innerhalb des Funktionsumfangs einer Funktion definiert sind, nicht von außen zugegriffen werden kann, bedeutet dies nicht, dass Sie ihre Werte nach Abschluss dieser Funktion nicht mehr verwenden können. PHP hat ein bekanntes
static
Schlüsselwort, das in objektorientiertem PHP häufig zum Definieren statischer Methoden und Eigenschaften verwendet wird. Man sollte jedoch berücksichtigen, dassstatic
es auch in Funktionen zum Definieren statischer Variablen verwendet werden kann.Was ist es 'statische Variable'?
Die statische Variable unterscheidet sich von der im Funktionsumfang definierten gewöhnlichen Variablen für den Fall, dass sie keinen Wert verliert, wenn die Programmausführung diesen Bereich verlässt. Betrachten wir das folgende Beispiel für die Verwendung statischer Variablen:
Ergebnis:
Wenn wir
$counter
ohne definiert hätten, wärestatic
jedes Mal der Echo-Wert der gleiche wie der$num
an die Funktion übergebene Parameter. Mitstatic
können Sie diesen einfachen Zähler ohne zusätzliche Problemumgehung erstellen.Anwendungsfälle für statische Variablen
Tricks
Statische Variable existiert nur in einem lokalen Funktionsbereich. Außerhalb der Funktion, in der es definiert wurde, kann nicht darauf zugegriffen werden. Sie können also sicher sein, dass der Wert bis zum nächsten Aufruf dieser Funktion unverändert bleibt.
Statische Variablen können nur als Skalar oder als Skalarausdruck definiert werden (seit PHP 5.6). Das Zuweisen anderer Werte führt unweigerlich zu einem Fehler, zumindest zu dem Zeitpunkt, als dieser Artikel geschrieben wurde. Sie können dies jedoch nur in der nächsten Zeile Ihres Codes tun:
Ergebnis:
Die statische Funktion wird von Methoden von Objekten derselben Klasse gemeinsam genutzt. Das folgende Beispiel ist leicht zu verstehen:
Dies funktioniert nur mit Objekten derselben Klasse. Wenn Objekte aus verschiedenen Klassen stammen (sich sogar gegenseitig erweitern), ist das Verhalten statischer Variablen wie erwartet.
Ist eine statische Variable die einzige Möglichkeit, Werte zwischen Aufrufen einer Funktion beizubehalten?
Eine andere Möglichkeit, Werte zwischen Funktionsaufrufen beizubehalten, ist die Verwendung von Verschlüssen. Verschlüsse wurden in PHP 5.3 eingeführt. Mit zwei Worten, Sie können den Zugriff auf einige Variablen innerhalb eines Funktionsumfangs auf eine andere anonyme Funktion beschränken, die der einzige Weg ist, auf sie zuzugreifen. In Abschlussvariablen zu sein, kann OOP-Konzepte wie 'Klassenkonstanten' (wenn sie als Wert geschlossen wurden) oder 'private Eigenschaften' (wenn sie als Referenz übergeben werden) in der strukturierten Programmierung imitieren (mehr oder weniger erfolgreich).
Letzteres erlaubt tatsächlich die Verwendung von Verschlüssen anstelle von statischen Variablen. Es ist immer Sache des Entwicklers, zu entscheiden, was verwendet werden soll. Es sollte jedoch erwähnt werden, dass statische Variablen bei der Arbeit mit Rekursionen auf jeden Fall nützlich sind und es verdienen, von Entwicklern bemerkt zu werden.
quelle
Ich werde keine vollständige Antwort auf die Frage veröffentlichen, da die vorhandenen und das PHP-Handbuch das meiste davon hervorragend erklären.
Aber ein Thema , das vermisst wurde , war , dass der Superglobals , einschließlich der häufig verwendeten
$_POST
,$_GET
,$_SESSION
usw. Diese Variablen sind Arrays , die immer zur Verfügung stehen, in jedem Bereich, ohne eineglobal
Erklärung.Diese Funktion druckt beispielsweise den Namen des Benutzers aus, der das PHP-Skript ausführt. Die Variable steht der Funktion problemlos zur Verfügung.
Die allgemeine Regel "Globale sind schlecht" wird in PHP normalerweise in "Globale sind schlecht, aber Superglobale sind in Ordnung" geändert, solange man sie nicht missbraucht. (Alle diese Variablen sind beschreibbar, sodass sie verwendet werden können, um eine Abhängigkeitsinjektion zu vermeiden, wenn Sie wirklich schrecklich waren.)
Es ist nicht garantiert, dass diese Variablen vorhanden sind. Ein Administrator kann einige oder alle mithilfe der
variables_order
Anweisung in deaktivieren.php.ini
Dies ist jedoch kein allgemeines Verhalten.Eine Liste der aktuellen Superglobalen:
$GLOBALS
- Alle globalen Variablen im aktuellen Skript$_SERVER
- Informationen zum Server und zur Ausführungsumgebung$_GET
- In der Abfragezeichenfolge der URL übergebene Werte, unabhängig von der für die Anforderung verwendeten HTTP-Methode$_POST
- Werte, die in einer HTTP-POST-Anforderung mitapplication/x-www-form-urlencoded
odermultipart/form-data
MIME-Typen übergeben wurden$_FILES
- Dateien, die in einer HTTP-POST-Anforderung mit einemmultipart/form-data
MIME-Typ übergeben wurden$_COOKIE
- Cookies wurden mit der aktuellen Anfrage übergeben$_SESSION
- Von PHP intern gespeicherte Sitzungsvariablen$_REQUEST
- Typischerweise eine Kombination von$_GET
und$_POST
, aber manchmal$_COOKIES
. Der Inhalt wird durch dierequest_order
Richtlinie in bestimmtphp.ini
.$_ENV
- Die Umgebungsvariablen des aktuellen Skriptsquelle