2024 年日本 PHP 研討會

取消參考

當您取消參考時,您只是斷開變數名稱和變數內容之間的連結。這並不表示變數內容將被銷毀。例如:

<?php

$a
= 1;
$b =& $a;
unset(
$a);

?>
不會取消 $b 的設定,只會取消 $a

同樣地,將此視為類似於 Unix 的 unlink 指令可能會有幫助。

新增註解

使用者貢獻的註解 7 則註解

ojars26 at NOSPAM dot inbox dot lv
16 年前
簡單看一下 PHP 參考是如何運作的
<?php
/* 想像一下這是記憶體映射
______________________________
|指標 | 值 | 變數 |
-----------------------------------
| 1 | NULL | --- |
| 2 | NULL | --- |
| 3 | NULL | --- |
| 4 | NULL | --- |
| 5 | NULL | --- |
------------------------------------
建立一些變數 */
$a=10;
$b=20;
$c=array ('one'=>array (1, 2, 3));
/* 看看記憶體
_______________________________
|指標 | 值 | 變數 |
-----------------------------------
| 1 | 10 | $a |
| 2 | 20 | $b |
| 3 | 1 | $c['one'][0] |
| 4 | 2 | $c['one'][1] |
| 5 | 3 | $c['one'][2] |
------------------------------------
執行 */
$a=&$c['one'][2];
/* 看看記憶體
_______________________________
|指標 | 值 | 變數 |
-----------------------------------
| 1 | NULL | --- | // $a 的值被銷毀,指標被釋放
| 2 | 20 | $b |
| 3 | 1 | $c['one'][0] |
| 4 | 2 | $c['one'][1] |
| 5 | 3 | $c['one'][2] ,$a | // $a 現在在這裡
------------------------------------
執行 */
$b=&$a; // 或 $b=&$c['one'][2]; 結果相同,因為 "$c['one'][2]" 和 "$a" 位於同一個指標。
/* 看看記憶體
_________________________________
|指標 | 值 | 變數 |
--------------------------------------
| 1 | NULL | --- |
| 2 | NULL | --- | // $b 的值被銷毀,指標被釋放
| 3 | 1 | $c['one'][0] |
| 4 | 2 | $c['one'][1] |
| 5 | 3 |$c['one'][2] ,$a , $b | // $b 現在在這裡
---------------------------------------
接下來執行 */
unset($c['one'][2]);
/* 看看記憶體
_________________________________
|指標 | 值 | 變數 |
--------------------------------------
| 1 | NULL | --- |
| 2 | NULL | --- |
| 3 | 1 | $c['one'][0] |
| 4 | 2 | $c['one'][1] |
| 5 | 3 | $a , $b | // $c['one'][2] 被銷毀,不在記憶體中,也不在陣列中
---------------------------------------
接下來執行 */
$c['one'][2]=500; //現在它在陣列中
/* 看看記憶體
_________________________________
|指標 | 值 | 變數 |
--------------------------------------
| 1 | 500 | $c['one'][2] | //建立它,它會落在記憶體中的任何(下一個)空閒指標上
| 2 | NULL | --- |
| 3 | 1 | $c['one'][0] |
| 4 | 2 | $c['one'][1] |
| 5 | 3 | $a , $b | //這個指標正在使用中
---------------------------------------
讓我們嘗試將 $c['one'][2] 返回到舊的指標,並移除參考 $a,$b。 */
$c['one'][2]=&$a;
unset(
$a);
unset(
$b);
/* 看看記憶體
_________________________________
|指標 | 值 | 變數 |
--------------------------------------
| 1 | NULL | --- |
| 2 | NULL | --- |
| 3 | 1 | $c['one'][0] |
| 4 | 2 | $c['one'][1] |
| 5 | 3 | $c['one'][2] | //$c['one'][2] 被返回,$a,$b 被銷毀
--------------------------------------- ?>
希望這個說明對您有所幫助。
sony-santos at bol dot com dot br
17 年前
<?php
//如果這樣做:

$a = "hihaha";
$b = &$a;
$c = "eita";
$b = $c;
echo
$a; // 顯示 "eita"

$a = "hihaha";
$b = &$a;
$c = "eita";
$b = &$c;
echo
$a; // 顯示 "hihaha"

$a = "hihaha";
$b = &$a;
$b = null;
echo
$a; // 沒有顯示任何內容(兩者都設為 null)

$a = "hihaha";
$b = &$a;
unset(
$b);
echo
$a; // 顯示 "hihaha"

$a = "hihaha";
$b = &$a;
$c = "eita";
$a = $c;
echo
$b; // 顯示 "eita"

$a = "hihaha";
$b = &$a;
$c = "eita";
$a = &$c;
echo
$b; // 顯示 "hihaha"

$a = "hihaha";
$b = &$a;
$a = null;
echo
$b; // 沒有顯示任何內容(兩者都設為 null)

$a = "hihaha";
$b = &$a;
unset(
$a);
echo
$b; // 顯示 "hihaha"
?>

我在 PHP 4.3.10 上分別測試了每種情況。
donny at semeleer dot nl
18 年前
以下是如何在不丟失先前設定的參考的情況下,取消設定參考的範例

<?php
$foo
= 'Bob'; // 將 'Bob' 的值賦值給 $foo
$bar = &$foo; // 透過 $bar 參考 $foo。
$bar = "My name is $bar"; // 修改 $bar...
echo $bar;
echo
$foo; // $foo 也被修改了。
$foo = "I am Frank"; // 由於參考的關係,修改 $foo 和 $bar
echo $bar; // 輸出:I am Frank
echo $foo; // 輸出:I am Frank

$foobar = &$bar; // 在 $foobar 和 $bar 之間建立新的參考
$foobar = "hello $foobar"; // 修改 $foobar,同時也會修改 $bar 和 $foo
echo $foobar; // 輸出:hello I am Frank
unset($bar); // 取消設定 $bar 並銷毀參考
$bar = "dude!"; // 賦值給 $bar
/* 即使 $bar 和 $foo 之間的參考被銷毀,$bar 和 $foobar 之間的參考也被銷毀,$foo 和 $foobar 之間仍然存在參考。 */
echo $foo; // 輸出:hello I am Frank
echo $bar; // 輸出:dude!
?>
lazer_erazer
18 年前
您關於一次取消設定所有被參考變數的想法是正確的,
只是稍微提醒一下,您用 unset() 更改了 NULL ...
再次說明,unset 只影響一個名稱,而 NULL 影響數據,
該數據由所有三個名稱保留...

<?php
$a
= 1;
$b =& $a;
$b = NULL;
?>

這也行得通!

<?php
$a
= 1;
$b =& $a;
$c =& $b;
$b = NULL;
?>
smcbride at msn dot com
2 年前
關於使用參考時 unset() 的一個小怪癖,或許對某些人有幫助。

如果您想刪除陣列參考的元素,您需要讓參考指向您要刪除的鍵值的父層。

<?php
$arr
= array('foo' => array('foo_sub1' => 'hey', 'foo_sub2' => 'you'), 'bar' => array('bar_sub1' => 'good', 'bar_sub2' => 'bye'));

$parref = &$arr['foo'];
$childref = &$parref['foo_sub1'];

unset(
$childref); // 這只會取消子項的參考
unset($parref['foo_sub1']); // 這會實際從 $arr 中移除資料;
$parref['foo_sub1'] = NULL; // 這會將元素設為 NULL,但不會刪除它。如果您在 unset() 後執行它,它會將鍵值加回來並設為 NULL

?>

這很適合用於通過引用動態地將某些東西傳遞給函數,而無需將整個陣列複製到函數中,但您想要對陣列進行一些維護。
frowa at foxmail dot com
3 年前
這是我的記憶方法。

<?php

// 變數 $a 指向值 1,就像一條線連接到值 1
$a = 1;

// 變數 $b 指向變數 $a 指向的值,就像一條新線連接到值 1
$b =& $a;

// 切斷變數 $a 到值 1 的線,現在 $a 是自由的,它沒有指向任何東西。所以 $a 的值為 null
unset($a);
?>

$a--------> 1

|
|
$b
libi
18 年前
clerca at inp-net dot eu dot org
"
如果您有很多參考連結到相同的內容,那麼這樣做可能很有用
<?php
$a
= 1;
$b = & $a;
$c = & $b; // $a, $b, $c 參考相同的內容 '1'

$b = NULL; // 所有變數 $a, $b 或 $c 都被設為 NULL
?>

"

------------------------

NULL 不會導致變數被移除。
它只是將所有變數的值更改為 "null"。
因為它們都指向記憶體中的相同「部分」。
To Top