PHP session 的奇怪规则 session_start(); var_dump($_SESSION); $name = 'laruence'; $_SESSION['name'] = null;输出: array(1) { ["name"]=> string(8) "laruence" }$name 和 $_SESSION['name']是八竿子打不着的两个变量, 它凭什么给弄成等同于同一个变量, 发明PHP那人脑残吧. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 或者这是一个bug? var_dump($_SESSION); 这一句如果写写在下面:session_start();$name = 'laruence';$_SESSION['name'] = null;var_dump($_SESSION);则 输出为: array(1){ ['name']=>null }; 但是其他页面的输出应该仍然是"laruence'. 也就是说, 离开此页面的时候, $_SESSION['name']才会被设置为$name的值. 我怎么觉得是你们搞错了啊!输出: array(1) { ["name"]=> string(8) "laruence" }这个是不可能的,你的这个var_dump($_SESSION);明明在$name = 'laruence';之前,应该是你在测试或者什么的时候已经给$_SESSION['name']赋值了,你如果要测试$_SESSION,要注意清空的清空下测试,或者重新打开浏览器,不然会被保存的默认浏览器关闭的! <?phpsession_start();var_dump($_SESSION);$name = 'angryfrog';$_SESSION['name'] = null;输出:array(1) { ["name"]=> NULL }是你自己把register_global打开造成的。 我要能控制就好了, 但是即使是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']置空了. 不管怎么说, 这规则奇葩到家了, 我不知道即使是这里的人有多少人知道具体的规则, 我知道的就是这些, 而且解释不通.如果这规则不奇葩, 它干嘛给警告? 是我错了,这个问题与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的值回写。 在session.bug_compat_42开启的情况下, PHP会认为变量name是$_SESSION['name']的一个引用, 在session_close的时候, 会把变量a的值回写。===============================================你看我的六楼, 事实并非如此, 你说的这个我也知道, 英文警告大体也是这个意思. 但是这里的回写是什么意思? 这种有什么用? $name是$_SESSION['name']的引用, 你去测试, 并非如此.如果$_SESSION里有这个变量, $同名变量就是Session的引用, 就这规则也够呛, 为了那点方便, 太危险了. 这也是PHP后续版本关闭它的原因吧, 也是我说他这规则脑残的原因. 简单的说, 就是bug, 在页面离开的时候, 也就是所谓的SESSION close的时候, 把同名变量的值写到这个SESSION里. 页面都结束了, 还写它干什么? 如果真是引用, 应该任何时候, SESSION都被改写了, 也不用等到结束的时候. ubuntu 下编译php遇到都问题 %E6%9C%88 返回文件名的问题 遍历mysql_fetch_array() 批量处理mysql数据时,如何加上筛选条件?请高手能直接给出代码,谢谢! 各位请问 : 我在window 2000下已安装mysql+php了,但我不知道怎样建立一个表啊 { 救命啊 } 参与讨论:php5与php4的不同之处 传递参数问题? 请问谁有pear相关资料?急急!! session的安全? 判断内容里有没有中文,然后要返回中文字符 请教一个解决方案
$name = 'laruence';
$_SESSION['name'] = null;
var_dump($_SESSION);则 输出为: array(1){ ['name']=>null }; 但是其他页面的输出应该仍然是"laruence'. 也就是说, 离开此页面的时候, $_SESSION['name']才会被设置为$name的值.
session_start();
var_dump($_SESSION);
$name = 'angryfrog';
$_SESSION['name'] = null;
输出:
array(1) { ["name"]=> NULL }
是你自己把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']置空了. 不管怎么说, 这规则奇葩到家了, 我不知道即使是这里的人有多少人知道具体的规则, 我知道的就是这些, 而且解释不通.如果这规则不奇葩, 它干嘛给警告?
是我错了,这个问题与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的值回写。
===============================================
你看我的六楼, 事实并非如此, 你说的这个我也知道, 英文警告大体也是这个意思. 但是这里的回写是什么意思? 这种有什么用? $name是$_SESSION['name']的引用, 你去测试, 并非如此.如果$_SESSION里有这个变量, $同名变量就是Session的引用, 就这规则也够呛, 为了那点方便, 太危险了. 这也是PHP后续版本关闭它的原因吧, 也是我说他这规则脑残的原因.