2009-04-18 2 views
11

Я использую основной пример php для глобального модификатора, и он не работает для меня: - |php global variable modifier не работает

$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. Это означает, что действительно есть случаи, когда глобальный режим не работает.

Пытался найти причину: кажется, что если у вас есть функция и поместить код в OP (который является php.net пример) внутри этой функции, вы получите ответ 2. Это немного странно, и своего рода имеет смысл в пути ...

(Я использую PHP 5.2.5 под Apache 2.2.8 в Win XP)

LE: МОЕ РЕШЕНИЕ ОК, решается следующим образом: когда вы используете глобальный 2-й функции, вы, очевидно, получаете сверхглобальные переменные, доступные всем (то есть, декалированные вне любой функции), но поскольку $ a и $ b объявляются внутри 1-й функции, они не входят в эту область и не доступны для 2-й функции. Мое предположение для решения состоит в том, чтобы объявлять глобальные $ a и $ b, вне 2-й функции, которая находится внутри первой функции. !! Обратите внимание, что 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 и другими).

Мое решение довольно простое:

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

Работает и для Laravel! – Adam

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().

Итак, когда ваше глобальное ключевое слово не работает, проверьте, включено ли оно в функцию. Поскольку решение этой проблемы хорошо объяснено в других ответах, поэтому я не добавил ее сюда.