PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [PHP] Kann man SO globale Variablen deklariert



ContainerDriver
31-10-2004, 21:53
Hallo,
ich habe eine Frage zu globalen Variablen, um sicherzugehen, dass das auch 100% korrekt ist:
kann man so globale Variablen deklarieren & initalisieren:


$GLOBALS['bla']="bommel";

?

In wie fern ist das ein Unterschied zu der Deklaration & Initialisierung einer Variablen außerhalb eines Funktionskörpers auf diese Art?


#...
bla="bommel";
#...
function test()
{
echo $GLOBALS['bla']."<br/>";
}

.

Ich habe hier etwas seltsame "Erscheinungen" beim includen von Dateien (mit include()), die wiederum mit include() etwas inkludieren & diese wieder usw. usf..

Wenn jemand Licht ins Dunkel bringen könnte, würde ich mich außerordentlich freuen ;)

Gruß, FLorian

Gaert
01-11-2004, 10:45
Hallo Florian,

Erstens: eine Variablendeklaration gibt es in PHP nicht...

Zu deinen Beispielen...
Es gibt folgende Möglichkeiten Globale Variablen zu deklarieren:



global $bla = 'xyz';
$GLOBALS['blabla'] = 'abc';


Mit dem Schlüsselwort global kann man sich auch Variablen aus dem obersten Namensraum des Skripts in deine Funktionen importieren... mit $GLOBALS[] funktioniert das nicht.

Beispiel:


$bla = 'abc';

function a() {
global $bla;
echo $bla; // Ausgabe: abc
}

function b() {
echo $GLOBALS['bla'] // Funktioniert nicht...
}


Beispiel 2:
Das Schlüsselwort global registriert die Variable automatisch in $GLOBALS;


global $bla = 'abc';

function b() {
echo $GLOBALS['bla'] //Ausgabe: abc
}


Beispiel 3:
Mit global kann man keine Variablen aus dem Namensraum einer Funktion verfügbar machen:





function a() {
$bla = 'abc';
}

a();


global $bla;
echo $bla; // keine Ausgabe


Es gibt noch ein paar weitere Beispiele... aber da kannst du selbst noch ein wenig rumprobieren... generell gilt: das Arbeiten mit dem Schlüsselwort global ist etwas verwirrend - ich verwende deshalb grundsätzlich nur noch das $GLOBALS Array - da kann ich mir sicher sein, dass das was ich reingeschrieben habe auch überall (inklusive der Includes) gelesen werden kann.
Bei der Objektorientierten Programmierung mit PHP5 verwende ich übrigens meistens statische Klassenvariablen statt Globale Variablen - reine Geschmackssache...



class container {
{
public static $bla;

public static function setVar($var,$value) {
self::$$var = $value;
}

public static function getVar($var) {
return self::$$var;
}

}




container::setVar('bla','abc');

function xy() {
echo container::getVar('bla');
container::setVar('bla','xyz');
}

echo container::getVar('bla');
xy();
echo container::getVar('bla');


Hoffe das hat dir ein wenig geholfen.

Gruß,

Gaert

undefined
01-11-2004, 10:54
Hallo Florian,
Beispiel:


$bla = 'abc';

function a() {
global $bla;
echo $bla; // Ausgabe: abc
}

function b() {
echo $GLOBALS['bla'] // Funktioniert nicht...
}

.......
Hoffe das hat dir ein wenig geholfen.

Gruß,

Gaert
Gaert, ich gehe mal davon aus das du dich hier verschrieben hast ;)
Natürlich kann man Globals innerhalb von Funktionen Inittialisieren ;)

<?php

$bla = "abc";

function b() {
echo "<pre>";
print_r( $GLOBALS );
echo "</pre>";
}
echo b();
?>

mfg undefined

Gaert
01-11-2004, 15:53
Das Beispiel bezog sich auf folgendes:



function a() {
echo $GLOBALS['bla']; //Funktioniert nicht...
}
$bla = "abc";
a();


im Vergleich zu



function a() {
global $bla;
echo $bla; //Ausgabe: abc
}
$bla = "abc";
a();


Ich denke das war auch die Antwort auf die ursprüngliche Frage...

undefined
01-11-2004, 17:18
Kann ich nicht so stehen lassen :D
Ein Variable vom setType (GLOBALS) ist sehr wohl innerhalb der Funktion GLOBAL. So lange sich die Initialisierung der Funktion nach der Festlegung der Variable kommt.

<?php
function falsch()
{
if ( ! isset( $GLOBALS['bla'] ) )
echo "nothing todo<br/>";
else
echo "wo ist " . $GLOBALS['bla'] . "<br/>";
}

function a() {
echo "wo bin ich: " . $GLOBALS['bla'] . "<br/>";
}

function b() {
return "Ich bin Global: " . $GLOBALS['bla'];
}

falsch();

$bla = "abc";

a();
echo b();
?>

Du hast in deinem Beipiel aber auch sehr schön die Fallstrike von Globalen Variablen aufgeführt. Ist mit einer der häufigsten Fehler.

mfg undefined

ContainerDriver
02-11-2004, 10:50
Okay, ich bin ein bisschen verwirrt :D

Ich fass jetzt mal zusammen:

Das hier funktioniert (obwohl Gaert gesagt hast, das funktioniert nicht):


function a() {
echo $GLOBALS['bla']; //funktioniert doch
}
$bla = "abc";
a();

.

Globale Variablen kann man so initialisieren:


$GLOBALS['bla']="abc";

.

Ist das jetzt korrekt?

undefined
02-11-2004, 12:15
Okay, ich bin ein bisschen verwirrt :D

Ich fass jetzt mal zusammen:

Das hier funktioniert (obwohl Gaert gesagt hast, das funktioniert nicht):


function a() {
echo $GLOBALS['bla']; //funktioniert doch
}
$bla = "abc";
a();

.

Die Variable ist erst dann innerhalb einer FUNKTION Existent wenn sie vor dem Aufruf der Funktion Initialisiert wird.
Mit GLOBALS kündigst dem PHP:Prozessor beim einlesen nur an hier ist eine Variable ist die später beim Aufruf im Globalen Namensraum zu finden ist ;)
FAZIT: Der jetzige CODE währe also richtig ;)



Globale Variablen kann man so initialisieren:


$GLOBALS['bla']="abc";

.

Ist das jetzt korrekt?
Dies ist noch ein Syntax aus PHP 3 zeiten, viele benutzen ihn um es etwas Übersichtlicher zu haben. Du kannst es schreiben wie du möchtest.
es ist also dier überlassen ;)
PS: Wenn du PHP5 verwendest schalte E_STRICT ein. Dann werden dir solche fehler angezeigt.
mfg undefined

ContainerDriver
02-11-2004, 17:56
Okay, schön!
Jetzt noch eine Frage (auf die Gefahr hin, dass ihr euch wiederholen müsst):


PS: Wenn du PHP5 verwendest schalte E_STRICT ein. Dann werden dir solche fehler angezeigt.

Wie würde dann die Codestelle in PHP 5 heißen?

undefined
02-11-2004, 19:00
In die oberste Datei und die erste Zeile ;)

error_reporting( E_ALL | E_STRICT );
mfg undefined

ContainerDriver
02-11-2004, 19:10
Stop.
Ich meine die korrekte Initialisierung einer globalen Variable (statt $GLOBALS['bla']='abc')!

Gaert
02-11-2004, 20:42
[QUOTE=florian hanisch:
Das hier funktioniert (obwohl Gaert gesagt hast, das funktioniert nicht):
[/QUOTE]

Habe z.Z. leider sehr wenig Zeit und im Moment auch gar nicht mit PHP, weshalb ich nichts ausprobiert habe - gut möglich, dass es in diesem Beispiel funktioniert - generell funktioniert es aber nicht (immer) auf diese Weise - warum hat undefined erklärt.



$GLOBALS['bla']="bommel";

ist die "moderne" Art globale Variablen zu deklarieren

ContainerDriver
03-11-2004, 18:57
Okay, allen vielen Dank!

Mit $GLOBALS funktioniert jetzt alles bestens!

Gruß, Florian