2014-01-20 49 views
-1

的PHP documentation狀態下面對unset()語言構造:php unset()它真的做了什麼?

銷燬指定的變量。

取消設置給定的變量

是什麼究竟意味着什麼?只需銷燬可變內容;清空一個變量,並給它的值null?或者這意味着,消滅變量不僅僅是它的內容,而是一切?

我寫了下面:

$a = "tom"; 

unset($a); 

var_dump($a); 

,並得到這個:

Notice: Undefined variable: a in... 
+0

它在內部完成它很複雜。所有你現在需要知道的是它將參考(變量名稱)破壞爲一個值,所以用給定的變量名稱無法達到該值。 – zerkms

+0

它從本地變量名稱表中刪除其名稱,並取消分配關聯的zval存儲。 – mario

+0

我想象一旦你刪除了引用,PHP的內部垃圾收集器就從那裏取得它。但是,它也取決於你是什麼樣的變量,它可能是一個關聯數組或全局引用的值,它不一定會完全摧毀變量。 –

回答

-1

它破壞的內容,並保留變量不確定狀態。

如果嘗試在未設置變量後再次訪問該變量,並且警告被禁用,則可能可以檢索該值,但絕對不能保證。

+0

這不完全正確。它不保證摧毀任何東西。 '$ a = 1; $ b = $ a;未設置($ a);' - 這裏的「內容」不是「銷燬」 – zerkms

+0

確實如此,但很可能垃圾收集器會在一段時間後重新使用內存來處理其他內容,這會「破壞它」。不一定立即。 –

+0

「但最有可能」---好吧,不。 – zerkms

-4

再舉一個例子:

樣品如何取消設置數組元素從一個MySQL請求到來的陣列結果。在這個示例中,它檢查文件是否存在,如果不存在,則從數組中刪除該行。

<?php 
$db->set_query("select * from documents where document_in_user = 0"); //1 
$documents = $db->result_to_array($db->get_result()); //1 

foreach ($documents as $key => $row) { //2 

    $file  = "uploads/".rawurldecode($row['document_name']); 

    if (file_exists ($file) == FALSE) { 
     unset($documents[$key]); //3 
    } 
} 

$documents = array_values($documents); // reindex the array (4) 
?> 

變量:

mysql table = documents, 
array = $documents 
array key (index) = $key 
array row (record sort of speak) = $row 

說明:

1.它從該表(MySQL的)獲得陣列

2.的foreach去通過數組$文件

未設置如果記錄不存在

4.array_values($documents)重新索引$documents array,否則你可能會遇到麻煩結束時,你的進程將開始期待起一個數組帶鑰匙($鑰匙) * 0(零) *。

+2

我看不到'unset()'是如何積極使用和解釋它如何實際工作.. –