Модификатор глобальной переменной 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.