解除引用

当您解除引用时,您只是断开了变量名和变量内容之间的绑定。 这并不意味着变量内容将被销毁。 例如

<?php
$a
= 1;
$b =& $a;
unset(
$a);
?>
不会解除 $b 的引用,只解除 $a 的引用。

同样,将此类比为 Unix unlink 命令可能会有所帮助。

添加备注

用户贡献的备注 7 则备注

442
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 被销毁
--------------------------------------- ?>
我希望这有帮助。
45
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 上单独测试了每种情况。
4
donny at semeleer dot nl
18 年前
这是一个解除引用而不丢失先前设置的引用的示例

<?php
$foo
= 'Bob'; // 将值 'Bob' 赋值给 $foo
$bar = &$foo; // 通过 $bar 引用 $foo。
$bar = "我的名字是 $bar"; // 修改 $bar...
echo $bar;
echo
$foo; // $foo 也被修改了。
$foo = "我是弗兰克"; // 由于引用关系,修改 $foo 和 $bar
echo $bar; // 输出:我是弗兰克
echo $foo; // 输出:我是弗兰克

$foobar = &$bar; // 在 $foobar 和 $bar 之间创建新的引用
$foobar = "你好 $foobar"; // 修改 $foobar,从而也修改 $bar 和 $foo
echo $foobar; // 输出:你好 我是弗兰克
unset($bar); // 取消 $bar 的设置,并销毁引用
$bar = "老兄!"; // 赋值给 $bar
/* 即使 $bar 和 $foo 之间的引用被销毁,$bar 和 $foobar 之间的引用也被销毁,
但 $foo 和 $foobar 之间仍然存在引用。 */
echo $foo; // 输出:你好 我是弗兰克
echo $bar; // 输出:老兄!
?>
5
lazer_erazer
17 年前
你关于一次取消所有引用变量的想法是对的,
只是一个小小的说明,你用 unset() 替换了 NULL...
再次说明,unset 只影响一个名称,而 NULL 影响数据,
数据由这三个名称保留...

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

这也能工作!

<?php
$a
= 1;
$b =& $a;
$c =& $b;
$b = NULL;
?>
1
smcbride at msn dot com
2 years ago
在使用引用时,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

?>

这对于通过引用将某些东西动态地传递给函数非常有用,这样你就不会将整个数组复制到函数中,但你想对数组进行一些维护。
2
frowa at foxmail dot com
3 years ago
这是我记住它的方法。

<?php

// 变量 $a 指向值 1,就像一条连接到值 1 的线
$a = 1;

// 变量 $b 指向变量 $a 指向的值,就像一条连接到值 1 的新线
$b =& $a;

// 切断变量 $a 到值 1 的线,现在 $a 是自由的,没有指向任何东西。所以 $a 的值是 null
unset($a);
?>

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

|
|
$b
-3
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"。
因为它们都指向内存中的同一“部分”。
To Top