session_start();
var_dump($_SESSION);
$name = 'laruence';
$_SESSION['name'] = null;输出: array(1) { ["name"]=> string(8) "laruence" }$name 和 $_SESSION['name']是八竿子打不着的两个变量, 它凭什么给弄成等同于同一个变量, 发明PHP那人脑残吧. 

解决方案 »

  1.   

    或者这是一个bug? var_dump($_SESSION); 这一句如果写写在下面:session_start();
    $name = 'laruence';
    $_SESSION['name'] = null;
    var_dump($_SESSION);则 输出为: array(1){ ['name']=>null }; 但是其他页面的输出应该仍然是"laruence'. 也就是说, 离开此页面的时候, $_SESSION['name']才会被设置为$name的值.
      

  2.   

    我怎么觉得是你们搞错了啊!输出: array(1) { ["name"]=> string(8) "laruence" }这个是不可能的,你的这个var_dump($_SESSION);明明在$name = 'laruence';之前,应该是你在测试或者什么的时候已经给$_SESSION['name']赋值了,你如果要测试$_SESSION,要注意清空的清空下测试,或者重新打开浏览器,不然会被保存的默认浏览器关闭的!
      

  3.   

    <?php
    session_start();
    var_dump($_SESSION);
    $name = 'angryfrog';
    $_SESSION['name'] = null;
    输出:
    array(1) { ["name"]=> NULL }
    是你自己把register_global打开造成的。
      

  4.   

    我要能控制就好了, 但是即使是register_global打开, 这个规则还是非常奇怪. 我不知道你是否真的清楚.首先
    session_start();
    var_dump($_SESSION);
    $name = 'angryfrog';
    $_SESSION['name'] = null;
    这3句, 后两句的顺序无关, 然后, 如果你在后面echo $_SESSION['name']的值 它仍然是null, 只有此页面离开之后, 任何页面访问 $_SESSION['name'] 都是$name的值了. 还有, 这种效果只有, 设为null的时候出现, 其它时候并不会出现, 包括unset($_SESSION['name']), 这样 就真把$_SESSION['name']置空了. 不管怎么说, 这规则奇葩到家了, 我不知道即使是这里的人有多少人知道具体的规则, 我知道的就是这些, 而且解释不通.如果这规则不奇葩, 它干嘛给警告?
      

  5.   


    是我错了,这个问题与register_global无关。不过我的5.4版本就没有这个问题,5.4也已经没有register_global这个选项了。你这代码貌似引用自laruence的博客:http://www.laruence.com/2009/07/13/976.html他在里面已经解释了原因。在session.bug_compat_42开启的情况下, PHP会认为变量name是$_SESSION['name']的一个引用, 在session_close的时候, 会把变量a的值回写。
      

  6.   

    在session.bug_compat_42开启的情况下, PHP会认为变量name是$_SESSION['name']的一个引用, 在session_close的时候, 会把变量a的值回写。
    ===============================================
    你看我的六楼, 事实并非如此, 你说的这个我也知道, 英文警告大体也是这个意思. 但是这里的回写是什么意思?  这种有什么用? $name是$_SESSION['name']的引用, 你去测试, 并非如此.如果$_SESSION里有这个变量, $同名变量就是Session的引用, 就这规则也够呛, 为了那点方便, 太危险了. 这也是PHP后续版本关闭它的原因吧, 也是我说他这规则脑残的原因.
      

  7.   

    简单的说, 就是bug, 在页面离开的时候, 也就是所谓的SESSION close的时候, 把同名变量的值写到这个SESSION里. 页面都结束了, 还写它干什么? 如果真是引用, 应该任何时候, SESSION都被改写了, 也不用等到结束的时候.