2010-07-07 3 views
12

Ja, ich weiß globale Variablen ist eine schlechte Praxis, aber für diesen einen dieser Regel nachlassen: PPHP globale Variable in einer Funktion nicht definiert, auch wenn globale Schlüsselwort verwendet wird

Mein Code:

include('something.php'); //where $from is declared 

function myfunc() { 
    global $from; 
    echo "from(myfunc)=$from<br />"; 
    ... 
} 

echo "from=$from<br />"; 
myfunc(); 

Das Ergebnis ist:

from=2010-05-01 
from(myfunc)= 

Was ist los? :(

EDIT: Wenn es hilft, den gesamten Code oben ist in einer View-Datei in CodeIgniter (und ja, ich weiß Funktionen sollen nicht in Aussicht sein: P)

+1

Ich habe es getestet und es funktioniert gut (nach dem Hinzufügen eines Semikolon nach dem "Echo") auf PHP 5.3.1. – Harmen

Antwort

22

Ich werde eine Wette Bier Sie nicht im globalen Rahmen dieses Schnipsel sind. Rufst Sie diese innerhalb einer Funktion?

in diesem Fall wird die $from Sie in something.php definieren, ist nicht global, während diejenige, die Sie in der Funktion Referenz.

Es wird wahrscheinlich funktionieren, wenn Sie eine global $from; i hinzufügen nside something.php bevor Sie $from definieren.

Es ist unnötig zu sagen, dass es keine gute Übung ist, und Sie sollten Gordons Rat befolgen.

+0

Hallo Pekka, du hast Recht. Ich habe '$ GLOBALS ['from'] = 'value' außerhalb der Funktion hinzugefügt, und der Wert wurde in' myfunc() 'gefunden. Ich habe nicht bemerkt, dass diese Seite von der '$ this-> load-> view() '-Funktion von CodeIgniter generiert wurde. Vielen Dank! – Obay

11

selbst tun einen Gefallen und so tun Dependency Injection.

function myfunc($from) { 
    return "from(myfunc)=$from<br />"; 
} 
$from = '2010-05-01'; 
echo myfunc($from); 

verwenden wird Ihr Code besser verwaltbar, weniger gekoppelt und einfacher Einheit testbare, weil sie aus dem globalen Bereich isoliert machen. Und wenn du es tust, denken die Leute, du bist cool.

+4

+1 Ich habe nie realisiert, dass ich sagen kann "Ich mache seit 2002 Abhängigkeitsinjektion" :) –

+0

Danke, ich werde stattdessen Dependency Injection verwenden: P – Obay