グローバル修飾子に基本的なphpの例を使用していますが、うまくいきません:-|
$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
}
Sum();
echo "***: ".$b;
これが結果です... $ ***: 2
これに影響を与える可能性のある php.ini のパラメータはありますか?
私もあなたの問題に直面していました。私はフレームワーク (Yii) を使用しているため、コードが実際に関数内にネストされていることを正確に認識していglobal
なかったため、期待どおりに動作していませんでした (omadmedia などで説明されているように)。
私の解決策は非常に簡単です:
global $a;
global $b;
$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
}
Sum();
echo "***: ".$b;
信じられないかもしれませんが、答えは 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番目はそれほど明白ではない場合があることに注意してください。
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.
私はあなたと同じ問題を抱えていて、ついに答えを見つけました
作業コード/デモ
$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 キーワードを使用すると問題が発生します
上記のコード例は私にとってはうまくいきます。ただし、$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を使用すると、関数を記述しながら説明と引数の順序を取得することもできます。
私が間違っていると想像できる唯一のことは、最初に関数を呼び出した後にグローバルスコープで変数を割り当てている場合です。つまり、関数は実際に変数を宣言していて、他の場所でそれらを上書きするだけです。たとえば、を呼び出しSum()
てから実行$a=1
し$b=2
ます。