2013-04-20 66 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 2013-04-20 07:42:47

+0

$ global將不再在PHP 5.4+中運行 - 謝天謝地,sh ..已經不存在了。 :-) – herrjeh42 2013-04-20 08:39:07

回答

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

因此,如果我在全局(func內)之前定義一個變量,它將是NULL? – IqbalBary 2013-04-20 07:49:39

+1

不,$ a是NULL,因爲在全局範圍內它是NULL(默認情況下PHP中所有未設置的變量都是NULL)。該函數中的'global $ a'告訴PHP使用函數內全局作用域中的'$ a'。因此,一旦局部變量現在具有來自全局變量(NULL)的值。 – hakre 2013-04-20 07:50:24

+0

另外,您不應該只想知道爲什麼會發生這種情況,而且還會遇到一個更重要的問題:您爲什麼需要一個全局變量? – hakre 2013-04-20 07:51:49

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

即使你確定全球$一個函數體,但是當它apear一個使用本地變量$。 參考Php variable reference 如果你想使用全球變量與你的本地變量相同的名稱,你必須用戶 $ GLOBALS ['c'] = $ GLOBALS ['a'] + $ b;如果$ c和$ a是全局定義 希望這可以幫到

0

我認爲,在第一種情況下$ a是未定義的。首先寫入$ a然後調用函數的值。在頁面頂部使用error_reporting(E_ALL)來了解腳本中的錯誤。

+0

即使'$ a'在全局範圍內未定義,全局關鍵字也會將其定義在本地範圍內,因此您不會看到該警告。 – hakre 2013-04-20 07:58:27

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:在現實中它做一個直接的參考範圍主要變量)