14

グローバル修飾子に基本的なphpの例を使用していますが、うまくいきません:-|

$a = 1;
$b = 2;

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

    $b = $a + $b;
} 

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

これが結果です... $ ***: 2

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

4

6 に答える 6

23

私もあなたの問題に直面していました。私はフレームワーク (Yii) を使用しているため、コードが実際に関数内にネストされていることを正確に認識していglobalなかったため、期待どおりに動作していませんでした (omadmedia などで説明されているように)。

私の解決策は非常に簡単です:

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

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

    $b = $a + $b;
} 

Sum();
echo "***: ".$b;
于 2014-04-13T21:12:29.517 に答える
15

信じられないかもしれませんが、答えは 2 です。これは、グローバルが機能しない場合が実際にあることを意味します。

原因を見つけようとしました: 関数があり、OP のコード (php.net の例) をその関数内に配置すると、答え 2 が得られるようです。これは少し奇妙で、ある意味で意味があります。 ..

(Win XP の Apache 2.2.8 で PHP 5.2.5 を使用しています)

LE: 私の解決策 OK、これで解決しました: 2 番目の関数で global を使用すると、明らかにスーパーグローバル変数が取得されます。これは、誰でも使用できるものです (つまり、関数の外側で宣言されています)。 、それらはそのスコープの一部ではなく、2 番目の関数では使用できません。解決策の私の推測は、$a と $b グローバルを、2 番目の関数の外側、つまり 1 番目の関数の内側でも宣言することです。!! ファイル(2番目の関数のみを含む)が別のファイルの別の関数の本体のどこかに含まれているなど、さまざまな理由により、1番目はそれほど明白ではない場合があることに注意してください。

于 2010-01-09T13:32:06.540 に答える
5

As @AgelessEssence answered, global keyword doesn't work if you have a nested function. It is obvious in his example. However, if it is not clear if a file is included. Here is the example.

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

In the code above, $a looks like a global variable. Actually, it is not because it is included in the function f() in a.php and $a is part of function f().

So, when your global keyword doesn't work, check whether it is included in a function. As the solution for this problem well explained in other answers, so I didn't add it here.

于 2015-07-31T05:53:32.607 に答える
2

私はあなたと同じ問題を抱えていて、ついに答えを見つけました

作業コード/デモ

$a=1;

function showA() {

    global $a;
    var_export($a);  

} 

showA(); // outputs "1"

動作しないコード/デモ

function encapsulation() {

    $a=1;

    function showA() {

        global $a;
        var_export($a);  

    };

    showA();

}  

encapsulation(); // outputs "NULL"

ご覧のとおり、ネストされた関数定義内でglobal キーワードを使用すると問題が発生します

詳細情報: php.net/manual/en/language.variables.scope.php#92868

于 2013-05-25T14:00:23.477 に答える
2

上記のコード例は私にとってはうまくいきます。ただし、$GLOBALSスーパー変数を使用することもできます。

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

ただし、できる限りグローバル変数は使用しないでください。関数を作成するためのより良い方法があります。パラメーター (引数)を使用し(おそらく参照渡し )、代わりに値を返します

/**
 * 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を使用すると、関数を記述しながら説明と引数の順序を取得することもできます。

于 2009-04-19T20:06:18.377 に答える
0

私が間違っていると想像できる唯一のことは、最初に関数を呼び出した後にグローバルスコープで変数を割り当てている場合です。つまり、関数は実際に変数を宣言していて、他の場所でそれらを上書きするだけです。たとえば、を呼び出しSum()から実行$a=1$b=2ます。

于 2009-04-19T20:20:41.977 に答える