PHP Symfony会话变量自动更新问题咨询
问题解答:无需调用
set(),修改取出的会话对象为何会同步更新会话内容? 这是PHP对象的引用传递特性导致的,和Symfony HTTP Foundation/Concrete CMS的会话实现无关:
- 当你通过
$session->get('tester_obj')获取会话中的对象时,PHP并不会创建这个对象的副本,而是返回一个指向会话中存储的原对象的引用,赋值给变量$x。 - 此时
$x和会话里的tester_obj指向的是同一个对象实例,你对$x的任何属性修改(比如$x->name = 'alex'、添加age属性),都会直接作用于原对象。 - 所以当你再次调用
$session->get('tester_obj')时,拿到的就是已经被修改过的原对象,自然能看到更新后的属性。
如果换成数组类型的数据就不会有这个现象——因为PHP中数组默认是按值传递的,取出数组修改后必须调用$session->set()把修改后的数组存回去,会话里的内容才会更新。
你的示例代码可以直观验证这一点:
if (!is_null($session)) { if ($session->has('tester_obj')) { $x = $session->get('tester_obj'); $x->name = 'alex'; $x->age = 40; var_dump($session->get('tester_obj')); } else { echo 'nope'; $x = new \stdClass(); $x->name = 'Steve'; $session->set('tester_obj', $x); } }
内容的提问来源于stack exchange,提问作者ScoobaSteve
相关产品推荐
相关产品推荐

