回答
他們會做稍微不同的事情:
未設置將刪除符號表中的變量,並通過減小對內容的引用計數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技術上$test = ''
將返回true,以
if(isset($test))
因爲它仍然是「集」,它只是設置爲en空值。
它將然而返回true以
if(empty($test))
,因爲它是一個空的變量。這取決於你正在檢查的內容。通常人們傾向於檢查變量是否被設置,而不是如果它是空的。
因此,最好完全取消它。
此外,這是比較容易理解
unset($test);
比這
$test = '';
第一馬上告訴您該變量不再設置。後者只是簡單地告訴你它被設置爲空白。當您要將東西添加到變量並且不希望PHP出錯時,這是常用的。
您正在做不同的事情,unset
的目的是銷燬指定的變量在您創建的位置上下文中,第二個示例只是將該變量設置爲空字符串。
清除一個變量不強制立即釋放內存,如果您關心性能,該變量設置爲NULL
可能是一個更好的選擇,但實際上,差異會不明顯......
討論在docs
:
未設置()不正是它的名字說 - 取消設置的變量。它不強制立即釋放內存。 PHP的 垃圾收集器會做它時,它 看到千篇一律 - 儘快意向,作爲 反正不需要的CPU週期, 或遲腳本之前將 耗盡內存,無論發生什麼, 第一。
如果你正在做$ whatever = null; 然後你正在重寫變量的 數據。您可能會獲得內存釋放更快的速度,但它可能會從真實需要 的代碼中竊取CPU 的週期,從而導致整個執行時間更長。
它們有完全不同的含義。前者使變量不存在。後者只是將其值設置爲空字符串。說哪一個更「好」並不重要,因爲它們是完全不同的東西。
你想清理內存嗎?如果是這樣,不要; PHP爲你管理內存,所以你可以放置它,它會自動清理。
如果你不想清理內存,那麼你需要弄清楚爲什麼你想取消設置變量或將其設置爲空,並選擇合適的變量。這樣做的一個很好的完整性檢查:讓我們說某人插入下面的代碼行後的某個地方你沒有設置/空:
if(strcmp($variable, '') == 0) { do_something(); }
再後來:
if(!isset($variable)) { do_something_else(); }
第一個將運行do_something()
如果設置該變量爲空字符串。如果您未設置變量,第二個將運行do_something_else()
。如果你的腳本行爲正常,你希望運行哪些?
我認爲最相關的區別是,取消設置變量表示變量不會被後續代碼使用(如果您嘗試使用它,也會通過報告E_NOTICE來「強制執行」,因爲jspcal表示這是因爲它不再在符號表中)。
因此,如果空字符串是一個合法(或標記)值,無論您對變量做什麼,請繼續並將其設置爲「'。否則,如果該變量不再有用,則將其設置爲更清晰的代碼意圖。
在這裏還有另一個'gotcha'考慮,參考。
,如果你有:
$a = 'foobar';
$variable =& $a;
然後做或者您的兩個選擇是完全不同的。
$variable = '';
套既$變量和$一個空字符串,其中作爲
unset($variable);
而從符號表中除去$變量除去$ a和$變量之間的參考鏈路。這確實是取消鏈接$ a和$變量而不設置$ variable引用別的變量的唯一方法。請注意,例如$ variable = null;不會這樣做。
- 1. 取消設置變量
- 2. 取消設置組變量
- 3. 取消設置變量,但不會取消設置
- 4. PHP會話設置爲變量並取消設置。
- 5. 設置變量定義VS
- 6. PHP $ _SESSION變量不會取消設置
- 7. 取消設置局部變量
- 8. 如何取消設置多個變量?
- 9. 在bash中取消設置readonly變量
- 10. 會話取消設置每個變量?
- 11. 取消設置參數變量
- 12. 如何取消設置$ _SESSION變量?
- 13. 取消設置php會話變量
- 14. 會話變量未被取消設置
- 15. 如何取消設置全局變量。
- 16. 將jQuery設置類設置爲變量
- 17. 設置變量
- 18. 設置變量
- 19. 設置變量
- 20. => vs - >訪問/設置類變量
- 21. PDO設置變量vs while循環
- 22. 取消設置所有變量? (不$ $ _SESSION ['']或全局變量)
- 23. 將變量值設置爲
- 24. 將值設置爲變量
- 25. 設置變量爲false
- 26. 將document.body.className設置爲變量
- 27. 將變量設置爲CGPointMake
- 28. cfhtmlhead重置/取消設置或取消?
- 29. 設置/取消設置下劃線TextView
- 30. 設置和取消設置Cookie
我不能相信沒有人提到'E_NOTICE' ......我的天哪,任何人仍然無視這個需要用_proper_編譯器打頭! – Tom 2010-01-11 04:56:48