2009-04-18 7 views
11

私はグローバル修飾子の基本的なPHPの例を使用しています。ここでphpグローバル変数修飾子が機能しない

$a = 1; 
$b = 2; 

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

    $b = $a + $b; 
} 

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

は結果である... $ ***:2

は、このに影響を与える可能性があるphp.iniの上のいずれかのパラメータがありますか?

+1

これは正確なコードですか?ここに情報を残していますか? – Matt

+0

もちろん、PHPの正確なバージョンは? – Alnitak

答えて

2

あなたの上記のコード例は私のために働きます。しかし、超可変性の$GLOBALSを使用することもできます。

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

グローバル変数は使用しないでください。あなたの機能をより良いものにする方法があります。代わりにparameters (arguments)(おそらくpass byreference)と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); 

PHPDOCを使用すると、コードを読むことなく、あなたの関数は、今から何年も何をするかを理解することができます。良いIDEを使用すると、関数を記述するときに説明と引数の順序を得ることもできます。

0

最初に関数を呼び出した後にグローバルスコープで変数を代入していると、間違っていると思います。つまり、あなたの関数は実際に変数を宣言していて、それを他の場所に上書きするだけです。たとえば、Sum()を呼び出し、$a=1$b=2を実行してを実行します。

13

それを信じるかどうか、私は答えを得ます:2も。 これは、実際にはグローバルが機能しない場合があることを意味します。

原因を発見しようとしました: あなたが機能を持っており、その関数内(php.netの一例である)OPのコードを置けば、あなたは答え2. を得るでしょう。これは少し奇妙な、ちょっとあるようです...のように理にかなって

LE(私は勝つXPでのApache 2.2.8の下でPHP 5.2.5を使用しています): MY SOLUTIONは OK、これを解決:あなたが世界的に使用する場合2番目の関数は明らかに、すべての人が利用できる(つまり、関数の外でデカールされた)超大域変数を取得しますが、$ aと$ bは第1の関数の中で宣言されているので、それらはそのスコープの一部ではなく、2番目の機能では使用できません。 私の考えでは、第1の関数の中にある第2の関数の外側にも、$ aと$ bグローバルを宣言することが考えられます。 !! 1番目のファイルは、ファイル(2番目の関数のみを含む)が別のファイルの別の関数の本体のどこかに含まれているなど、さまざまな理由であまり明らかではないことに注意してください。

1

私はあなたのよう同じ問題を持って、そして最終的に答え

作業コード/DEMO

$a=1; 

function showA() { 

    global $a; 
    var_export($a); 

} 

showA(); // outputs "1" 

非動作するコード/DEMO

function encapsulation() { 

    $a=1; 

    function showA() { 

     global $a; 
     var_export($a); 

    }; 

    showA(); 

} 

encapsulation(); // outputs "NULL" 

を見つけました私はまた、あなたの問題に直面しましたphp.net/manual/en/language.variables.scope.php#92868

18

:あなたが見ることができるように、ネストされた関数定義

詳細内グローバルキーワードを使用した場合、問題が発生します。私はフレームワーク(Yii)を使用しているので、コードが実際に関数の中に入れ子になっていることを正確に認識していないため、globalは期待通りに動作しませんでした(omadmediaなどで説明されています)。

私のソリューションは非常に簡単です:@AgelessEssenceは答えとして、あなたは、ネストされた機能を持っている場合、グローバルキーワードは動作しません

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

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

    $b = $a + $b; 
} 

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

これはCodeIgniter 3.0でも動作します – semihcosu

+1

Works for Laravel! – Adam

3

。彼の例では明らかです。ただし、ファイルが含まれているかどうかは不明です。ここに例があります。

//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 

上記のコードでは、$ aはグローバル変数のように見えます。実際には、a.phpの関数f()に含まれ、$ aは関数f()の一部であるためではありません。

グローバルキーワードが機能しない場合は、それが関数に含まれているかどうかを確認してください。この問題の解決策は他の回答でよく説明されているので、ここでは追加しませんでした。

関連する問題