2013-04-20 7 views
0

Его очень простой код, но я не понимаю, какой смысл :(PHP глобальная переменная не показывая правильный ответ

function aaa($b){ 
$a = 30; 
global $a,$c; 
return $c=($b+$a);} 
echo aaa(40); //Output is 40 

Почему выход 40? Когда я называю $ а за пределами функции она дает мне желаемый ответ так, что точка

$a = 30; 
function aaa($b){ 
global $a,$c; 
return $c=($b+$a); 
} 
echo aaa(40); //Output is 70 


function aaa($b){ 
global $a,$c; 
$a = 30; 
return $c=($b+$a); 
} 
echo aaa(40); //Output is 70 
+1

Это потому, что [глобальные переменные никогда не правильный ответ] (http://stackoverflow.com/questions/5166087/php-global-in-functions/5166527 # 5166527) – Gordon

+0

$ global больше не будет работать в PHP 5.4+ - бог благодарности, sh .. ушел. :-) – herrjeh42

ответ

1

Посмотрите, что возвышается global ключевое слово здесь:

function aaa($b) { 
    $a = 30;    # local variable, will be overwritten just in the next line 
    global $a, $c;   # importing $a from the global scope - NULL 
    return $c = ($b + $a); # $c = (40 + NULL) 
} 

Руководство по адресу http://php.net/global напоминает, что глобальная переменная влияет на функцию, если она используется внутри нее. Это не только для первого вызова, но и для всех последующих вызовов.

Это делает функцию недетерминированной, поэтому менее полезный код, и вы можете - как вы это делали, - раздражать его.

Простой выход есть: Вместо того, чтобы параметрические значения этой функции в глобальных переменных, превратить их в параметры:

function aaa($a, $b, &$c) { 
    return $c = ($b + $a); 
} 

echo aaa(30, 40, $c); //Output is 70 

код не только намного легче читать, но и детерминированной. При вызове он всегда будет вести себя одинаково. Это означает меньше угадывания.

Этот пример до сих пор проблему возвращения значения по параметру (по ссылке), однако вы можете видеть, как хорошо, что это на самом деле не нужно больше:

function aaa($a, $b) { 
    return ($b + $a); 
} 

echo $c = aaa(30, 40); //Output is 70 

Уроки отнимать:

  • Не используйте глобальные переменные внутри функций - они стоят на вашем пути.
  • Уменьшите количество параметров, которые имеет функция (это около все значения, соответствующие глобальным значениям).
+0

Итак, если я определяю переменную до global (внутри func), она будет NULL? – IqbalBary

+1

Нет, '$ a' - NULL, потому что в глобальной области это NULL (по умолчанию в PHP все неустановленные переменные NULL). 'global $ a' в функции говорит PHP использовать' $ a' из глобальной области внутри функции. Поэтому локальная переменная Once теперь имеет значение из глобальной переменной (NULL). – hakre

+0

Также вы не должны удивляться только тому, почему это происходит здесь, но также следует гораздо более важному вопросу: зачем вам нужна * глобальная переменная здесь? – hakre

0
in php a variable Scope priority is 
1- local variable 
2- global variable 

даже определить, глобальные $ а в теле функции, но локальные переменные $ а используются, когда появляться. обратитесь к Php variable reference Если вы хотите использовать глобальную переменную с тем же именем вашей локальной переменной, вы должны указать $ GLOBALS ['c'] = $ GLOBALS ['a'] + $ b; if $ c и $ a является глобальным определением надеюсь, что эта помощь

0

Думаю, в первом случае $ a не определено. Сначала напишите значение функции $ a then call. Используйте error_reporting (E_ALL) в верхней части страницы, чтобы узнать ошибки в скрипте.

+0

Даже «$ a» не определено в глобальной области, глобальное ключевое слово определяет его в локальной области, поэтому вы не увидите этого предупреждения. – hakre

1

При использовании, например global $a;, PHP перезаписывает переменную $a и присваивает ей ссылку, как если бы это утверждение заменяется:

$a = &$GLOBALS["a"]; // and the same with every other variable which is used in global 

И как $a не определено в первом примере, $GLOBALS["a"] оценивается как null, и поэтому $a становится ссылкой на переменную, содержащую значение null.

Попробуйте var_dump($GLOBALS); после и перед вызовом функции. Он покажет вам новый индекс с именем a после вызова функции (со значением null или значением, которому вы его присвоили).

(Ps:. На самом деле это делает прямую ссылку на переменный в основном объеме)

Смежные вопросы