您好,欢迎访问一九零五行业门户网

PHP引用以及误区

什么是引用 php中的引用可以理解成变量的别名。由于php的变量名是存储在符号表(symbol table)中的,变量内容是存储在堆中,引用就是用符号表中的不同符号(symbol)名称来访问同一存储内容,和unix文件系统中的hardlink是同一个概念,比如: ?php$a = 1;$b = $
什么是引用php中的引用可以理解成变量的别名。由于php的变量名是存储在符号表(symbol table)中的,变量内容是存储在堆中,引用就是用符号表中的不同符号(symbol)名称来访问同一存储内容,和unix文件系统中的hardlink是同一个概念,比如:
value = 2; // 修改对象的$value属性echo $myvalue; // 输出2,$myvalue与class foo中的$value值相同
与指针的区别引用与指针很像,但是其并不是指针,看如下的代码:
| object id | ---> | object(class a) | * +-----------+ +-----------------+ * ^ * +-----------+ | * $b --> | object id | ---------+ * +-----------+ * * */$c = new b;$a = $c;$a->testb = changed class b;/* * 此时$a,$b,$c的关系: * +-----------+ +-----------------+ * $b --> | object id | ---> | object(class a) | * +-----------+ +-----------------+ * * +------------+ * $a --> | object id2 | -------------+ * +------------+ | * v * +------------+ +-----------------+ * $c --> | object id2 | ---> | object(class b) | * +------------+ +-----------------+ */echo object a: ; var_dump($a); //[testb]=> string(15) changed class becho object b: ; var_dump($b); //[testa] => int(2)echo object c: ; var_dump($c); //[testb]=> string(15) changed class b
如果对象是按照引用传递的,那么$a, $b, $c输出的内容应该一样,事实上结果并非如此。 看下面通过引用传递对象的列子:
testa = 2;/* * 此时$aa, $bb的关系: * * +-----------+ +-----------------+ * $bb --> | object id | ---> | object(class a) | * +-----------+ +-----------------+ * ^ * | * $aa ---------+ * * */$cc = new b;$aa = $cc;$aa->testb = changed class b;/* * 此时$aa, $bb, $cc的关系: * * +-----------+ +-----------------+ * | object id | ---> | object(class a) | * +-----------+ +-----------------+ * * $bb ---->-----+ * | * $aa ---->-----+ * | * v * +------------+ * | object id2 | --------------+ * +------------+ | * v * +------------+ +-----------------+ * $cc --> | object id2 | ---> | object(class b) | * +------------+ +-----------------+ */echo object aa: ; var_dump($aa); //[testb]=>string(15) changed class becho object bb: ; var_dump($bb); //[testb]=>string(15) changed class becho object cc: ; var_dump($cc); //[testb]=>string(15) changed class b
此时$aa,$bb,$cc三者内容完全一样,所以可以看出对象并不是按照引用传递,要尽快走出这个误区。
参考:
http://www.php.net/manual/en/language.references.phphttp://www.php.net/manual/en/language.oop5.references.php
原文地址:php引用以及误区, 感谢原作者分享。
其它类似信息

推荐信息