PHP Conference Japan 2024

取消引用

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

<?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; // 输出:due!
?>
lazer_erazer
18 年前
您关于一次取消设置所有引用变量的想法是正确的,
只是一个小小的说明,您将 NULL 替换为 unset()...
同样,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”。
因为它们都指向内存中的同一“部分”。
To Top