swoole中的websocket,如果使用了对象 = 对象,则会相互引用,并非赋值?

1 swoole中的websocket,如果使用了对象 = 对象,则会相互引用,并非赋值?

2 问题出现是这样的, 在websocket中的user login的时候有一个校验, 如果有重复在线的情况,会有一个踢人的动作,这时候会修改传过来的data 最开始 data = 一个对象 然后 kick = data; 然后Kick修改了一些对象的属性。 然后push 一个kick信息,

此时打印kick和data发现data竟然也变成了kick! 按理说Kick修改不会影响到data,因为我用的不是引用。

3 因为函数中有多次引用,我在onmessage中写了一个reflect类,其中$this->data = frame->data. 我怀疑push印象了onmessage的处理。然后加了打印,发现push根本不会出发onmessage(废话)

4 然后又加打印,发现在push信息之前,data就已经随着kick修改了!

5 问题清晰了,我在这个函数中添加了 $a = 1; $b = $a; $b = 2; 此时是1,2 结果OK

$a = new \stdClass(); $a->name = 'name'; $a->year= 20'; $b = $a; $b->name = 'name2' 发现 结果是相同的,俩人的name都是Name!!

后来又尝试了下数组,发现数组也OK。

6 我又担心是在我的reflect中的单例有影响,跑到swoole的websocekt中的onmessage中进行了测试。 得到结论是$a = $b的时候,如果$b是个对象,那修改$a的时候也会影响到$b 比如 $a = new \stdClass(); $a->name = 'name'; $a->year= 20'; $b = $a; $b->name = 'name2' 发现 结果是相同的,俩人的name都是Name!! 但是 如果最后$b =1 ,则打印结果是 a = {name : name2, year: 20} , b = 1

第一次接触的常驻内存就是swoole,不知道是否常驻内存和这个结果有关系?那又如何只有对象有此现象呢 求指点,谢谢各位!

2018-12-05 16:38
0
1

探索者 - one框架 -- 极简的基于swoole常驻内存框架

赞同来自: bloodtear

这个和swoole,没有关系。

php 对象赋值 为引用 字符串,数组 为拷贝

对象你要拷贝 可clone

2018-12-05 18:29
0

bloodtear

赞同来自:

的确是php的正常情况,受教了。

2018-12-06 17:46

要回复问题请先登录注册