You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 23:25:18