2010-01-11 84 views

回答

11

他們會做稍微不同的事情:

  • 未設置將刪除符號表中的變量,並通過減小對內容的引用計數1.之後對變量的引用將觸發通知(「未定義變量」)。 (請注意,通過實現__unset()),對象可以覆蓋其屬性的默認未設置行爲。

  • 設置爲空字符串將使內容的引用計數遞減1,將內容設置爲長度爲0的字符串,但符號仍將保留在符號表中,並且仍然可以引用該變量。 (注意,一個對象可以通過實現__set()來覆蓋其屬性的默認賦值行爲。

在較老的php中,當ref計數降到0時,調用析構函數並立即釋放內存。在更新的版本中(> = 5.3),php使用緩衝方案,對循環引用具有更好的處理能力(http://www.php.net/manual/en/features.gc.collecting-cycles.php),所以內存可能稍後被釋放,但它可能不會被延遲......無論如何,並沒有真正引起任何問題,新的算法可以防止某些內存泄漏。

如果變量名不再被使用,unset應該快幾個cpu週期(因爲不需要創建新的內容)。但如果重新使用變量名稱,php將不得不創建一個新的變量和符號表項,所以它可能會變慢!在大多數情況下差異可以忽略不計。

如果您想將該變量標記爲無效以供以後檢查,可以將其設置爲false或null。這比使用isset()進行測試要好,因爲變量名中的拼寫錯誤將返回false而沒有任何錯誤...您還可以將false和null值傳遞給另一個函數,並保留sentinel值,這是無法完成的未設置無功...

,所以我會說:

$var = false; ... 
if ($var !== false) ... 

$var = null; ... 
if (!is_null($var)) ... 

會比

檢查定點值更好3210
2

技術上$test = ''將返回true,以

if(isset($test)) 

因爲它仍然是「集」,它只是設置爲en空值。

它將然而返回true以

if(empty($test)) 

,因爲它是一個空的變量。這取決於你正在檢查的內容。通常人們傾向於檢查變量是否被設置,而不是如果它是空的。

因此,最好完全取消它。

此外,這是比較容易理解

unset($test); 

比這

$test = ''; 

第一馬上告訴您該變量不再設置。後者只是簡單地告訴你它被設置爲空白。當您要將東西添加到變量並且不希望PHP出錯時,這是常用的。

2

您正在做不同的事情,unset的目的是銷燬指定的變量在您創建的位置上下文中,第二個示例只是將該變量設置爲空字符串。

清除一個變量不強制立即釋放內存,如果您關心性能,該變量設置爲NULL可能是一個更好的選擇,但實際上,差異會不明顯......

討論在docs

未設置()不正是它的名字說 - 取消設置的變量。它不強制立即釋放內存。 PHP的 垃圾收集器會做它時,它 看到千篇一律 - 儘快意向,作爲 反正不需要的CPU週期, 或遲腳本之前將 耗盡內存,無論發生什麼, 第一。

如果你正在做$ whatever = null; 然後你正在重寫變量的 數據。您可能會獲得內存釋放更快的速度,但它可能會從真實需要 的代碼中竊取CPU 的週期,從而導致整個執行時間更長。

0

它們有完全不同的含義。前者使變量不存在。後者只是將其值設置爲空字符串。說哪一個更「好」並不重要,因爲它們是完全不同的東西。

你想清理內存嗎?如果是這樣,不要; PHP爲你管理內存,所以你可以放置它,它會自動清理。

如果你不想清理內存,那麼你需要弄清楚爲什麼你想取消設置變量或將其設置爲空,並選擇合適的變量。這樣做的一個很好的完整性檢查:讓我們說某人插入下面的代碼行後的某個地方你沒有設置/空:

if(strcmp($variable, '') == 0) { do_something(); } 

再後來:

if(!isset($variable)) { do_something_else(); } 

第一個將運行do_something()如果設置該變量爲空字符串。如果您未設置變量,第二個將運行do_something_else()。如果你的腳本行爲正常,你希望運行哪些?

2

我認爲最相關的區別是,取消設置變量表示變量不會被後續代碼使用(如果您嘗試使用它,也會通過報告E_NOTICE來「強制執行」,因爲jspcal表示這是因爲它不再在符號表中)。

因此,如果空字符串是一個合法(或標記)值,無論您對變量做什麼,請繼續並將其設置爲「'。否則,如果該變量不再有用,則將其設置爲更清晰的代碼意圖。

+1

我不能相信沒有人提到'E_NOTICE' ......我的天哪,任何人仍然無視這個需要用_proper_編譯器打頭! – Tom 2010-01-11 04:56:48

0

在這裏還有另一個'gotcha'考慮,參考。

,如果你有:

$a = 'foobar'; 
$variable =& $a; 

然後做或者您的兩個選擇是完全不同的。

$variable = ''; 

套既$變量和$一個空字符串,其中作爲

unset($variable); 

而從符號表中除去$變量除去$ a和$變量之間的參考鏈路。這確實是取消鏈接$ a和$變量而不設置$ variable引用別的變量的唯一方法。請注意,例如$ variable = null;不會這樣做。