2010-01-13 73 views
0

我一直在閱讀有關引用的PHP手冊,有些事情讓我感到困惑。它表示引用不是指向內存地址的指針,而是指向內存地址,而是...通過引用未設置PHP

而是它們是符號表 別名。

如果引用指向符號表條目然後指向內存地址,這實際上不是一個指針嗎?

編輯:

一些偉大的答案。只是想在這裏彈出...我如何取消設置另一個指向的變量?

$var = "text"; 
$ref =& $var; 
unset($ref); 

看起來這個工作,我需要取消$var以及使GC刪除。

回答

1

有一個很棒的PHP References Tutorial它應該比PHP文檔本身更深入地解釋所有的東西,甚至可以解釋變量創建時會發生什麼。

PHP內部通過一個結構實現可變 值知道作爲 _zval_struct,通常簡稱爲一個的zval。除了存儲關於其類型的值和信息 的 之外,zval還指定了一個refcount。引用計數 計算對 值的引用次數,對於垃圾收集器的操作 而言是必不可少的, 允許在不再使用 時釋放內存。

PHP中的引用僅僅是一個 變量,對應於與另一個變量相同的 zval。參考文獻 可以明確創建使用 特殊形式的分配操作 與等號 符號後的符號。

+0

由於有很好的鏈接而被接受。儘管所有的輝煌答案!謝謝 :) – Louis 2010-01-14 01:58:01

5

關鍵是你不能像其他語言那樣對「指針」進行任意操作,例如C.在其他語言中,你可以做類似「pointer ++」的操作,從而向前邁進一步在記憶中。這在PHP中是不可能的。

+2

更多詳細信息:http://us.php.net/manual/en/language.references.arent.php – 2010-01-14 00:03:25

4

不可能通過引用取消設置變量,因爲unset()實際上刪除引用而不是值。垃圾收集器然後清理每個沒有任何引用的變量,包括原始變量名稱。

這是一件好事。設想兩個對象在私有變量中持有對第三個對象的引用。如果一個對象取消它的私有變量,另一個對象將不受影響。

如果您可以通過引用取消設置,它將違反公共/私人模式。

0

PHP global or $GLOBALS

從@Artefacto: 「裏面一個功能,如果你想取消設置一個全局變量,你必須使用未設置($ GLOBALS [ 'varname的']),而不是全球$ varname的;未設置($ VARNAME);」。