Модификатор глобальной переменной php не работает
Я использую основной пример php для глобального модификатора, и он не работает для меня: - |
$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
}
Sum();
echo "***: ".$b;
Вот результат...
$ ***: 2
Есть ли какой-либо параметр на php.ini, который может повлиять на это?
Ответы
Ответ 1
Я также столкнулся с вашей проблемой. Поскольку я использую структуру (Yii), я точно не знал, что мой код действительно вложен внутри функций, и поэтому global
не вел себя так, как ожидалось (как объясняется omadmedia и другими).
Мое решение довольно просто:
global $a;
global $b;
$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
}
Sum();
echo "***: ".$b;
Ответ 2
Верьте или нет, я также получаю ответ: 2.
Это означает, что действительно есть случаи, когда глобальный режим не работает.
Пробовал найти причину:
Кажется, что если у вас есть функция и поместите код OP (который является примером php.net) внутри этой функции, вы получите ответ 2.
Это немного странно, и любопытное имеет смысл в некотором роде...
(Я использую PHP 5.2.5 под Apache 2.2.8 в Win XP)
LE:
МОЕ РЕШЕНИЕ
Хорошо, решил: когда вы используете глобальную функцию во 2-й функции, вы, очевидно, получаете сверхглобальные переменные, доступные всем (т.е. декалированные вне любой функции), но поскольку $a и $b объявлены внутри 1-й функции, они не являются часть этой области и недоступны для второй функции.
Мое предположение для решения состоит в том, чтобы объявить глобальные значения $a и $b за пределами второй функции, которая находится внутри первой функции.
!! Обратите внимание, что 1-й может быть не столь очевидным по различным причинам, например, ваш файл (содержащий только 2-ю функцию), который включен где-то в теле другой функции в другом файле.
Ответ 3
Как ответ @AgelessEssence, глобальное ключевое слово не работает, если у вас есть вложенная функция. Это очевидно в его примере. Однако, если неясно, включен ли файл. Вот пример.
//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 выглядит как глобальная переменная. Собственно, дело не в том, что оно включено в функцию f() в a.php, а $a является частью функции f().
Итак, когда ваше глобальное ключевое слово не работает, проверьте, включено ли оно в функцию. Поскольку решение этой проблемы хорошо объяснено в других ответах, поэтому я не добавил ее сюда.
Ответ 4
Ваш примерный код выше для меня работает. Но вы также можете использовать $GLOBALS.
function Sum()
{
$a = $GLOBALS["a"];
$b =& $GLOBALS["b"];
$b = $a + $b;
}
Глобальные переменные не должны использоваться, если вы можете помочь. Есть лучшие способы сделать ваши функции. Используйте параметры (аргументы) (возможно pass by reference) и вместо этого вернуть значение.
/**
* 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 вы также можете получить объяснение и порядок аргументов при написании функции.
Ответ 5
У меня есть SAME PROBLEM, как вы, и, наконец, нашел ответ
рабочий код/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"
как вы можете видеть, проблема возникает при использовании ключевого слова global внутри определения вложенной функции
Дополнительная информация: php.net/manual/en/language.variables.scope.php#92868
Ответ 6
Единственное, что я могу представить, что вы ошибаетесь, - это назначить переменные в глобальной области после вызова функции в первую очередь. То есть ваша функция фактически объявляет переменные, а затем вы просто перезаписываете их в другом месте. Например, вызов Sum()
, а затем выполнение $a=1
, $b=2
.