PHP Geltungsbereich von Variablen!

Belee

Lt. Commander
Registriert
Dez. 2006
Beiträge
1.518
Hallo

Also es heisst, das eine Variable wenn sie nicht global gesetzt ist, nur in dem gesetzten Bereich gültig ist.
Heisst also von -> <?php $huhu ?> <- bis, ist die voll da.

Was ich hier jetzt aber nicht verstehe, wie soll denn in einem Script ein Bereich aussehen wo $huhu dann keine Geltung mehr hat?

Heisst auch mit anderen Worten, wenn ich eine index.php habe und alles in ihr includieren, jedes Script jede Variable sehen kann?
Wenn da so ist, dann muss man ja in allen Scripten genau aufpassen was man den variablen als Name vergibt, denn, überschneiden sich variablen ist das Chaos perfekt.

Ist das nicht der Fall, dann würde mich interessieren was mit Geltungsbereich gemeint ist.

Denn, ich habe heute ein kleines Script im Kopf der index.php includiert und kann aus jedem weiteren in der index.php includierten Script auf die darin gesetzten variablen zugreifen, ich frage mich aber warum? und wenn das so richtig ist, wie kann man sowas verhindern? als Funktionen einbinden? ich stehe im Wald und sehe nichts mehr.

Wäre nett wenn mich jemand aufklärt, und ja, ich habe gelesen und gelesen doch irgendwie scheint es mir da sich nichts verstanden habe.
 
Sagen wir mal so, um Geltungsbereich abzustecken gibt es dafür nicht { und } im PHP Script ?
 
Dachte ich auch erst doch leider ist das nicht der Fall, denn beim testen gerade sind die Variablen in dem Script im Kopf {eingeshlossen}, und das verstehe ich irgendiwe nicht.

Aber mal eine andere Frage, kann man das Verhalten eventuell in der php.ini verändern? ich denke nicht oder?
 
Grundsätzlich gibts da verschiedene "Variablentypen".

1.: Die stinknormale Variable
Diese ist im gesamten gerade auszuführenden Script verfügbar, sofern sie nicht innerhalb einer Funktion oder einer Klasse aufgerufen werden soll. Daher ist diese Variable, beispielsweise in einer Header.php gesetzt, auch in der Footer.php verfügbar, wenn beide Dateien in einer Index.php includiert sind - der Grund ist: Index.php ist das Hauptscript, das ausgeführt wird und bettet den Inhalt der Header.php und Footer.php exakt an der Stelle in der Index.php ein, an der der Include stattfindet. Du könntest eben auch den Inhalt der Header.php und Footer.php gleich in die Index.php schreiben - wäre exakt das selbe.

2.: Die in Funktionen gesetzten Variablen
Beispiel:

PHP:
<?php
$var1 = "Hallo ";

function bla() {
   $var2 = "Welt!";
   echo $var1.$var2;
}

echo "Test 1: ".$var1.$var2."<br/>";
echo "Test 2: ".bla();

//Ausgabe:
// Test1: Hallo
// Test2: Welt
?>

Eine Variable, die extern einer Funktion gesetzt wird, ist nicht innerhalb der Funktion verfügbar, wenn sie nicht via global $variable; innerhalb der Funktion globalisiert wurde. Andersherum sind alle Variablen, die innerhalb einer Funktion gesetzt wurden, extern nicht verfügbar, wenn diese nicht von der Funktion per "return $variable" zurückgegeben wurde.

Bei Klassen verhält es sich im Grunde genauso, nur dass es hier mehr Möglichkeiten gibt den Zugriff auf die innerhalb der Klasse gesetzten Variablen und auch das Setzen von Variablen extern der Klasse zu ermöglichen.

3.: Globale Variablen
Grundsätzlich kann jede Variable auch eine Superglobale Variable sein, allerdings ist es nötig diese in $GLOBALS["variablenname"] zu verpacken. Find ich eine superätzende, unübersichtliche und wirklich unschöne Methode. $_POST, $_GET, $_COOKIE, $_SERVER, $_ENV, $_REQUEST, $_FILES und $_SESSION sind grundsätzlich überall verfügbar, in jeder Klasse, in jeder Funktion, in jedem Script (der Inhalt der Variablen kann je nach dem was übergeben wurde variieren).

4.: Konstanten
Konstanten sind eigentlich keine Variablen, weil sie sich, wenn man sie einmal gesetzt hat (via define("Name", "Wert"); ), nicht mehr verändern kann. Dafür sind sie ebenso wie die Superglobalen Variablen absolut überall innerhalb des ausgeführen Scripts verfügbar. Eignen sich sehr gut für fixe Werte, die nicht geändert werden dürfen.

Ich hoff ich konnt da ein wenig Licht ins Dunkle bringen.
 
variablen im globalen scope sind grundsätzlich auch global sichtbar. nur functions beschränken den scope.
 
Und in Blöcken (Schleifen, if... nicht aber Funktionen) deklarierte Variablen sind außerhalb trotzdem sichtbar, hat mich damals etwas verwirrt.
 
carom schrieb:
Und in Blöcken (Schleifen, if... nicht aber Funktionen) deklarierte Variablen sind außerhalb trotzdem sichtbar, hat mich damals etwas verwirrt.

Das hat mich letztens erst wieder verblüfft, das ist nämlich in anderen Sprachen nicht so!
 
Funktionen und Klassen haben jeweils einen eigenen Scope, der Rest ist identisch.
Dein include führt ja zu einem langen prozeduralen Script, und das hat einen Scope.
 
@Belee
Deine Frage lies sich mit 2 Minuten googlen und/oder mit einem Blick im PHP Manual beantworten...

Zum Thema zu vielen Variabeln und der Gefahr, dass sich diese überschreiben:
Ich setzte für jeden eigenen Zweck Arrays ein.
$Config['Mysql'][0]['user']... etc. So werden grundsätzlich nie $Config varaibeln im Skript nochmals gestetzt oder überschreiben.
Oder in einer direkten Anwendung:
$instant_messages['inbox']['count_new_messages'] . So kann ich gezielt danach alle Teile von Posteingang (inbox) oder sogar einfach die ganze Varaible $instant_messages löschen nach Abschluss aller relevanten Daten. Der Nachteil ist halt, es bilden sich dann teilweise sehr lange Variabeln-Namen, jedoch muss man das soweiso erwarten wenn man sehr sehr viele Variabeln hat.
 
Also du solltest redundante Variablen-Deklarationen lieber mit Arrays schön durchgliedern:

PHP:
$dateiName['variablenName']

Das Ganze brauch man bei aktuellen Servern nicht mehr, da es etwas Neues gibt: Namespaces! Einfach mal googlen. (ab PHP 5.3)

Allgemein gilt, dass du durch "function" erstmal die Funktion von Allem abschottest.
Es sei denn du gibst Variablen in die Funktion hinein - Durch die Parameter im Rumpf.

PHP:
function meineKleineBubble($variableHineingeben) { return $variableHineingeben;}

Oder du routest die Variablen hinein:

PHP:
function meineKleineBubble() { return $GLOBALS['huhu'];}

Grüße
 
Zuletzt bearbeitet:
Namespaces sind nur in Verbindung mit Klassen relevant, und die haben sowieso einen eigenen Scope. Die Namespaces sind eher dazu gedacht um Namenskollisionen von Klassen zu verhindern.
 
Das seh ich allerdings genauso. Namespaces für Variablen zu verwenden halte ich für falsch, es würde vielmehr alles verkomplizieren, das Debugging vielleicht sogar stören, weil ein Mensch nunmal gerne eigentlich offensichtliche Dinge übersieht und dann stundenlang drüber brütet.

Nene, Namespaces nur für Klassen nutzen.
 
Aus der sichern Seite ist man doch dann, wenn man viel Fantasie hat und halt immer andere Namen den Variablen gibt. Ich mache es so das ich die dem Script anpasse z.B. fürs Gästebuch fangen bei mir alle Varaiblen mit gb an also $gbname, $gbort usw. ich schaue immer das ich nichts von der Stange benutze :D tut denke ich auch der Sicherheit gut oder? zumindest muss ich mir keine Gedanken machen von wegen überschreiben der Variablen. Ist ja bei CSS-Klassen genauso, tut der Übersicht ganz gut weil man dann genau weiß was wofür ist, und wenn ich Klassen haben die ich woanders auch nutzen kann dann heissen die immer .stdFooter .stdHeader usw.
 
Wenn man ein MVC-Framework nutzt hat man das Problem gar nicht, da ist dann jedes Modul in seiner eigenen Klasse bzw. Methode und gegenseitig überschreiben kann sich nichts.

Und wenn es nur ein Mikro-Framework wie Silex ist...
 
Belee schrieb:
Aus der sichern Seite ist man doch dann, wenn man viel Fantasie hat und halt immer andere Namen den Variablen gibt.

Auf der sicheren Seite ist man dann, wenn man möglichst _keine_ globalen Variablen verwendet. Denn nur das entspricht "State of the Art".
 

Ähnliche Themen

Zurück
Oben