2010-02-07 100 views
16

對不起,我是一個初學者,我不能確定這是一個多好的問題,也許這聽起來對你們中的一些人來說是完全明顯的。PHP中全局變量和函數參數之間的優缺點?

if 我們用這兩個下面是一樣哪個更好?

function doSomething ($var1,$var2,..){ 
    ... 
} 

OR

function doSomething(){ 
    global $var1,$var2,..; 
    ... 
} 

我們使用我的意思是,我知道的是,在第二個方案中,我們也可以改變全局變量的價值。但是如果我們不需要這樣做,那麼這是寫這個函數的更好方法呢?傳遞變量的內存少於宣佈全局函數嗎?

+2

除了以下答案中未使用「全局」的原因之外,還應考慮代碼的可重用性。例如,如果您有一個實用程序文件的功能,那麼在包含該文件的任何腳本中,您必須確保您的變量命名與這些函數中的全局變量相匹配。這可能會產生問題,特別是對於複雜的腳本。或者,如果您想通過「插入」已有函數來重構腳本,則需要檢查腳本的所有代碼,甚至是與該函數無關的代碼,以確保不存在命名衝突。 – GZipp 2010-02-07 08:59:42

+0

我想補充一點,你也可以考慮在你的函數之外添加全局變量聲明,但這仍然是不好的做法,因爲別人可能不知道他們是否導入你的代碼。他們可能不知道他們正在導入該全局變量並創建具有相同名稱的另一個變量,從而覆蓋原始變量。 – imagineerThat 2013-05-31 23:51:36

回答

19

內存使用情況是一個微不足道的問題。更重要的是,代碼容易遵循,並且不會有......不可預測的結果。從這個角度看,添加全局變量是一個非常糟糕的IDEA。

如果你擔心內存使用情況,我們該做的是

function doSomething (&$var1, &$var2,..) { 
    ... 
} 

這將通過引用傳遞的變量,並在內存不能創建的新副本。如果您在執行該功能期間修改它們,則這些修改將在執行返回給調用者時反映出來。

但是,請注意,即使這是記憶的原因,這是非常不尋常的。由於我上面列出的原因(修改它們給調用者),使用by-reference的通常原因是。要走的路幾乎總是簡單

function doSomething ($var1, $var2) { 
    ... 
} 
+0

這是我失蹤的一點,當我們的代碼開始增長時,有函數參數有助於知道函數將使用什麼。 – Mohammad 2010-02-07 08:23:46

+0

如果$ var1和$ var2是隻讀變量,它們不會消耗更多的內存。進一步閱讀,關於PHP變量和參考文獻:http://derickrethans.nl/talks/phparch-php-variables-article.pdf – Dor 2010-02-07 08:32:49

4

編寫它以獲取參數。可維護性遠比微觀優化更重要。當你使用參數時,變量不能在意想不到的地方修改。

12

避免使用全局變量,而是在參數方法中使用傳遞變量。取決於程序的大小,性能可能可以忽略不計。

但是,如果您關心的性能這裏要注意與問候局部變量約global variable performance一些重要的東西(函數中定義的變量。)

  • 遞增一個全局變量的2倍以上的本地變量慢。
  • 只聲明一個全局變量而不在函數中使用它也會減慢速度(與增加一個局部變量大致相同)。 PHP可能會檢查全局是否存在。

此外,全局變量會增加使用錯誤值的風險,如果它們在代碼中的其他位置發生更改。

+0

你鏈接和信息是有用的,我希望我也可以標記你的正確答案BC它是。 – Mohammad 2010-02-07 08:24:25

1

傳入參數,避免全局變量。只保留給定情況所需的範圍是衡量良好代碼設計的一個指標。你可能想看看PHP變量範圍...

http://php.net/manual/en/language.variables.scope.php

一個很好的資源,對什麼是最好的實踐和內存管理一些指針。

2

雖然這是不好的做法,只要你保證全球不會被寫入,但只有讀你將有PARAMATERS的靈活性。作爲替代方案,您可以傳遞一個參數(或者兩個,如果它真的與函數一起使用,如exp),其餘的則放在一個選項數組中(有點像jquery)。 這樣你不使用全局變量,有一些參數的靈活性,並明確定義了每個參數的默認值。

function get_things($thing_name,$opt= array() { 
    if(!isset($opt["order"])) $opt["order"]= 'ASC'; 
} 
1

從PHP 4開始,使用全局變量和大變量會顯着影響性能。

有在$數據3MB字符串二進制地圖數據和運行10K測試如果該位是0或1的不同全局用途提供了以下時間結果:

function getBit($pos) { 
global $data; 
$posByte = floor($pos/8); 
... 
} 

T5位開:0.05495s,求:5.04544s,所有:5.10039s

function getBit($data) { 
global $_bin_point; 
$pos = $_bin_point; 
$posByte = floor($pos/8); 
} 

T5位開:0.03947s,求:0.12345s,所有:0.16292s

function getBit($data, $pos) { 
$posByte = floor($pos/8); 
... 
} 

t5位打開:0.05179s,查找:0.08856s,全部:0.14035s

因此,傳遞參數比使用全局變量快於> = 3Mb。尚未通過$ &數據參考進行測試,也未通過PHP5進行測試。