2009-04-18 18 views
11

Ich verwende das grundlegende PHP-Beispiel für den globalen Modifikator, und es funktioniert nicht für mich: - |php globale Variable Modifier funktioniert nicht

$a = 1; 
$b = 2; 

function Sum() 
{ 
    global $a, $b; 

    $b = $a + $b; 
} 

Sum(); 
echo "***: ".$b; 

Hier ist das Ergebnis ... $ ***: 2

Gibt es einen Parameter auf der php.ini, die dies bewirken könnte?

+1

Ist dies der genaue Code? Lässt du irgendwelche Informationen hier raus? – Matt

+0

natürlich hat er - wie genau welche Version von PHP ...? – Alnitak

Antwort

2

Ihr Beispiel Code oben funktioniert für mich. Sie können aber auch die $GLOBALS Supervariable verwenden.

function Sum() 
{ 
    $a = $GLOBALS["a"]; 
    $b =& $GLOBALS["b"]; 
    $b = $a + $b; 
} 

Globale Variablen sollten nicht verwendet werden, wenn Sie es jedoch helfen können. Es gibt bessere Möglichkeiten, um Ihre Funktionen zu machen. Verwenden Sie stattdessen parameters (arguments) (möglicherweise pass byreference) und return a value.

/** 
* Calculate the sum of the parameters 
* @param int|float $a one or more parameter 
* @param int|float $a, ... 
* @return int|float 
*/ 
function sum($a) 
{ 
    $args = func_get_args(); 
    return array_sum($args); 
} 

$a = 1; 
$b = 2; 

$b = sum($a, $b); 

Mit PHPDOC können Sie verstehen, was Ihre Funktionen Jahren tun ab sofort, ohne den Code zu lesen. Mit einer guten IDE können Sie auch die Erklärung und Argument Reihenfolge erhalten, wie Sie die Funktion schreiben.

0

Das einzige, was ich mir vorstellen könnte, schief zu laufen ist, wenn Sie Variablen im globalen Bereich zuweisen, nachdem Sie zuerst eine Funktion aufgerufen haben. Das heißt, Ihre Funktion deklariert tatsächlich die Variablen und überschreibt sie dann an anderer Stelle. Rufen Sie beispielsweise Sum() und dann tun $a=1, $b=2.

13

Ob Sie es glauben oder nicht, ich bekomme Antwort: 2 auch. Dies bedeutet, dass es tatsächlich einige Fälle gibt, in denen global nicht funktioniert.

versucht, die Ursache zu finden: Es scheint, dass, wenn Sie eine Funktion haben und den Code des OP setzen (was ein php.net Beispiel ist) innerhalb dieser Funktion werden Sie Antwort 2. Dies ist ein bisschen komisch und irgendwie bekommen macht in gewisser Weise Sinn ...

LE (ich bin PHP 5.2.5 unter Apache 2.2.8 in Win XP): Meine Lösung OK, löste dies: wenn Sie den globalen Einsatz in die zweite Funktion bekommt man offensichtlich die superglobalen Variablen, die für alle verfügbar sind (dh außerhalb jeder Funktion dekalarisiert), aber da $ a und $ b innerhalb der ersten Funktion deklariert sind, Sie sind nicht Teil dieses Bereichs und stehen der 2. Funktion nicht zur Verfügung. Meine Schätzung für eine Lösung ist, $ a und $ b global zu deklarieren, auch außerhalb der 2. Funktion, die innerhalb der 1. Funktion ist. !! Beachten Sie, dass die erste möglicherweise aus verschiedenen Gründen nicht so offensichtlich ist, wie Ihre Datei (die nur die zweite Funktion enthält) irgendwo im Körper einer anderen Funktion in einer anderen Datei enthalten ist.

1

Ich habe das gleiche Problem wie Sie, und fand schließlich die Antwort

Arbeits Code/DEMO

$a=1; 

function showA() { 

    global $a; 
    var_export($a); 

} 

showA(); // outputs "1" 

nicht funktionierenden Code/DEMO

function encapsulation() { 

    $a=1; 

    function showA() { 

     global $a; 
     var_export($a); 

    }; 

    showA(); 

} 

encapsulation(); // outputs "NULL" 

wie Sie sehen können, tritt das Problem auf, wenn das Schlüsselwort global innerhalb einer verschachtelten Funktionsdefinition

Mehr Infos mit: php.net/manual/en/language.variables.scope.php#92868

18

ich auch mit dem Problem konfrontiert wurde. Da ich ein Framework (Yii) verwende, war mir nicht ganz bewusst, dass mein Code tatsächlich in Funktionen verschachtelt war und sich daher global nicht wie erwartet verhalten hat (wie von omadmedia und anderen erklärt).

Meine Lösung ist recht einfach:

global $a; 
global $b; 
$a = 1; 
$b = 2; 

function Sum() 
{ 
    global $a, $b; 

    $b = $a + $b; 
} 

Sum(); 
echo "***: ".$b; 
+2

Dies funktioniert auch für CodeIgniter 3.0 – semihcosu

+1

Funktioniert auch für Laravel! – Adam

3

Als @AgelessEssence beantwortet, wird global Schlüsselwort nicht, wenn Sie eine verschachtelte Funktion haben. Es ist offensichtlich in seinem Beispiel. Wenn es jedoch nicht klar ist, ob eine Datei enthalten ist. Hier ist das Beispiel.

//a.php 
function f() { 
    require_once('./a_inc.php'); 
} 

f(); 

//a_inc.php 
$a = 12; 

function g() { 
    global $a; 

    var_dump($a); 
} 

g(); 

//result 
null 

Im obigen Code sieht $ a wie eine globale Variable aus. Tatsächlich ist es nicht, weil es in der Funktion f() in a.php enthalten ist und $ a Teil der Funktion f() ist.

Überprüfen Sie also, ob Ihr globales Schlüsselwort nicht funktioniert, ob es in einer Funktion enthalten ist. Wie die Lösung für dieses Problem in anderen Antworten gut erklärt, so habe ich es hier nicht hinzugefügt.

Verwandte Themen