首先引发这篇博文的是来源于这篇帖子:https://segmentfault.com/q/10...
经过了思考之后,我决定把回答思考变成博客做一下记录,如有不对之处,欢迎指正。
指针与引用
- 首先,引用和指针是不一样的,指针在C语言里的概念是表示变量的地址;
- 引用在PHP里是表示变量2是变量1的别名,如:
$a = 'hello';
$b = &$a;
此时可以说$b就是$a,$a就是$b;是同一个东西,比如你英文名叫 Steven
,中文名叫 二狗子
,不管叫啥,都是你。
PHP中的对象传递
然后说一下PHP5之后的“默认情况下PHP的对象是通过引用传递的这件事情。
如:
class Obj() {
public $o = 'hello';
}
$a = new Obj();
$b = $a;
$c = &$a;
此时,$b=$a
其实表示的并不是$b
是$a
的引用,$a
和 $b
可以说是没什么关系的,有关系的是实例化Obj
类得到的对象。
也就是说,此时$a和$b都是实例化Obj
后得到的对象,而$b=$a
唯一产生的是$b
从$a
这里得到了实例化Obj
后的引用;
然后看$c = &$a
此时是$c
是$a
的引用,也就是说$c
就是$a
;
假设:
unset($b);
unset($c);
那么unset($b)
只是删除了实例化Obj
后得到的对象的一次引用计数,unset($c)
则删除了$a
和$b
(因为两个表示同一个东西);
同样的,假设:
$a->o = 'test';
echo $b->o; // string 'test'
虽然说$a和$b'没什么关系'
,但是与实例化后的对象有关系,也就是$a改变的是实例化后的对象的数据,而$b的调用也是调用了这个对象的数据,所以从一定层面上看起来其实是有关系的。
再一个假设这样说还不明白的话,从我们web的业务逻辑来看。
用户A和用户B都登陆了网站,用户A改变了存储评论的数据表的数据,用户B假设去取这条数据,则用户B获取到就是修改后的数据,而其实用户A和用户B是没什么关系的。
而引用其实类似于用户A同时在手机端和电脑端登陆,然后改变了评论数据表的数据,不管是在手机端还是在电脑端重新获取数据都是修改过的,但是实际上就是一个人。
引用计数
我文中提到了一个引用计数的名词,这里又涉及到PHP中的另外一个问题,就是PHP的引用计数,这个可以参考PHP官方的文档,我觉得已经很详细了:
http://php.net/manual/zh/feat...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。