我是php新手并从php.net学习它。任何人都可以在摘要中说明为什么该页面(http://php.net/manual/en/language.references.arent.php)说哪些参考不是& 引用不是指针。
我是初学者所以请任何人用简单易懂的词语解释我吗?
答案 0 :(得分:3)
简单来说,引用是别名。
PHP中的变量分为两部分:名称和值。名称指向值。
$x = 2;
$y = $x;
$z = &$x;
执行$x = 2;
时,名称x
会存储在当前范围的符号表中,而值2
会存储在zval
中(不要{39}} ; t ask,它是在PHP中存储值的数据结构的内部名称。
执行$y = $x;
时,名称y
存储在当前范围的符号表中,$x
(2
)的值将复制到新的范围内zval
结构。
执行$z = &$x;
时,名称z
存储在当前范围的符号表中,但不会创建新的zval
。相反,z
设置为指向与zval
相同的x
。
变量$x
,$y
和$z
使用的内存如下所示:
+---------+ +---------+
| x | -------------> | 2 |
+---------+ +---------+
^
+---------+ | +---------+
| y | -------------------------> | 2 |
+---------+ | +---------+
|
+---------+ |
| z | --------------------+
+---------+
当通过引用函数传递值或函数返回引用时,相同的事情发生,只有名称存储在不同的符号表中(在上面的解释中注释"current scope")。
让'看到这段代码:
function f(& $z) {
$y = $z;
$z = $z + 2;
}
$x = 2;
f($x);
在$x = 2;
之后,内存看起来像这样:
+---------+ +---------+
| x | -------------> | 2 |
+---------+ +---------+
在执行函数f()
期间,内存如下所示:
+===== global ====+
| +---------+ | +---------+
| | x | -------------> | 4 |
| +---------+ | +---------+
+=================+ ^
|
+====== f() ======+ |
| +---------+ | | +---------+
| | y | -------------------------> | 2 |
| +---------+ | | +---------+
| | |
| +---------+ | |
| | z | --------------------+
| +---------+ |
+=================+
y
和z
存储在与x
不同的符号表中,当调用{{1}时,它们将被删除(连同包含它们的整个符号表) }返回。
删除f()
后,其值也会被删除,因为没有任何名称可以再指向它。但是,因为y
指向的值也由z
指向(x
是别名),所以该值不会与$z
一起删除,并且它在函数调用中幸存。 z
使用f()
修改值;并且通过变量$z
在主程序中可以看到此更改。
当函数返回引用时,事情以类似的方式发生。该函数返回一个未复制的值,但指向它的新名称将创建到调用代码的符号表中。
答案 1 :(得分:0)
如果您对它们有什么疑问,我建议您学习语言C指针。
无论如何,这是一个非常简化的解释:
引用不是指向变量的内存地址,但它们只是将参数传递给函数并在函数更改时返回修改的参数的方法。