2010-04-03 3 views
5

Ich habe eine Frage über die globale Initialisierung der Variablen.isset() und PHP Globale Variable

function hello_testing() { 
    global $conditional_random; 
    if (isset($conditional_random)) { 
     echo "foo is inside"; 
    } 
} 

Die globale Variable (conditional_random) darf nicht vor die Funktion aufgerufen wird hello_testing() initialisiert werden.

Was passiert also mit meiner Validierung über isset(), wenn $conditional_random nicht initialisiert ist? Wird es scheitern oder wird es immer wahr sein?

+0

Auf einer Seitennotiz versuchen Sie weg von globalen bleiben. Es ist ein sicheres Zeichen für Spaghetti-Code –

+1

@Manos Ich stimme zu, aber wenn Sie in der Wordpress-Community (als ein Beispiel) entwickeln, ist es mehr oder weniger unmöglich, sich von globalen Variablen oder einer Reihe anderer schlechter Konventionen fern zu halten. Meiner Meinung nach, wenn Sie mit PHP arbeiten, haben Sie sich damit abgefunden, schlechte Programmierpraktiken zu tolerieren und müssen nur relativ sichere Wege kennen, um mit dem zu arbeiten, was Sie haben. –

Antwort

9

Nun, warum Sie nicht nur testen? ;-)

Hinweis: nicht so einfach, wie man denken würde - die vollständige Antwort lesen ;-)


Aufruf der hello_testing(); Funktion, ohne dass die Stellgröße:

hello_testing(); 

Ich bekomme keine Ausgabe - was bedeutet isset zurückgegeben false.


Aufruf der Funktion, nachdem die Stellgröße:

$conditional_random = 'blah'; 
hello_testing(); 

Ich erhalte eine Ausgabe:

foo is inside 

Welche global funktioniert wie erwartet zeigt an, wenn die Variable gesetzt ist - gut , darüber sollte man keinen Zweifel haben ^^



aber beachten Sie, dass issetfalse wenn eine Variable gesetzt ist zurück, und null!
anzeigen manual page of isset()

Was bedeutet, dass ein besserer Test wäre:

function hello_testing() { 
    global $conditional_random; 
    var_dump($conditional_random); 
} 

hello_testing(); 

und dies zeigt:

null 

Nein Hinweis: die Variable vorhanden! Auch wenn null.

Da ich die Variable nicht außerhalb der Funktion gesetzt habe, zeigt es, dass globaldie Variable setzt - aber es gibt keinen Wert hinein; Das heißt, es ist null wenn nicht bereits außerhalb der Funktion gesetzt.


While:

function hello_testing() { 
    //global $conditional_random; 
    var_dump($conditional_random); 
} 

hello_testing(); 

Gibt:

Notice: Undefined variable: conditional_random 

Beweist, dass Hinweise

;-)

Und aktiviert werden, wenn die globale nicht tat die Variable " set" Das vorherige Beispiel hätte dieselbe Notiz gegeben.


Und schließlich:

function hello_testing() { 
    global $conditional_random; 
    var_dump($conditional_random); 
} 

$conditional_random = 'glop'; 
hello_testing(); 

Gibt:

string 'glop' (length=4) 

(Rein meinem Beispiel zu demonstrieren, wird nicht betrogen ^^)

+1

Ihr 'Test' ist also zu sehen, ob eine Benachrichtigung ausgelöst wird? Während die Erklärung, wie isset funktioniert, gut ist, scheint dies keine sinnvolle Alternative zu sein. – Omn

-1

Global setzt die Variable. Daher gibt isset($some_globald_variable) immer True zurück.

Die bessere Option ist empty()

if(empty($globald_variable)) 
{ 
// variable not set 
} 
+0

wollen nicht wie ein Esel klingen :), aber Sie haben eine Klammer in Ihrer 'if' Anweisung vergessen :) – Gabriel

+5

Die Variable wird erstellt, aber sie wird als null initialisiert. isset gibt false für eine Variable mit einem Nullwert zurück. – goat

+0

@goat hat recht, diese Antwort ist falsch –

6

Sie überprüfen können, ob sehen Das Globale wurde erstellt, indem geprüft wird, ob der Schlüssel in $ GLOBALS:

012 existiert
echo array_key_exists('fooBar', $GLOBALS)?"true\n":"false\n"; 
//Outputs false 

global $fooBar; 

echo array_key_exists('fooBar', $GLOBALS)?"true\n":"false\n"; 
//Outputs true 

echo isset($fooBar)?"true\n":"false\n"; 
//Outputs false 

Dies ist der einzige Weg, den ich kenne, um die Existenz eines globalen zu überprüfen, ohne eine Warnung auszulösen.

Wie Manos Dilaverakis erwähnt, sollten Sie möglichst keine Globals verwenden.