我不是在调用session_start()
和php.ini session.auto_start = 0
。
我仍然可以将变量分配给范围而没有任何错误?未设置 Cookie,但范围在整个页面中仍然可用。如果我没有启动会话,PHP 应该引发错误吗?
由于 $_SESSION 是一个超全局变量,因此它始终在所有范围内可用。
仅仅因为会话本身尚未使用浏览器初始化,并不意味着此变量不存在。 它仍然在那里等待使用,您可以随时自由存储它,但我的理解是,如果您写入它,然后初始化会话,它将被清除。
编辑:
此代码会导致two => Second
按预期进行。
<?php
$_SESSION['test'] = "string";
session_start();
$_SESSION['two'] = "Second";
foreach( $_SESSION as $key => $val )
{
print $key . " => " . $val;
print "<br />";
}
?>
您可以分配给$argc
和$argv
尽管它们仅在 CLI 中定义;您可以分配给 $_FILES
、$_SERVER
甚至分配给 $GLOBALS
。所有这些都是变量,PHP 不会阻止你分配新值。由于它是一种动态语言,不需要变量声明,因此它不会阻止您初始化变量。但是,如果您在为其分配任何内容之前以及调用 session_start
之前尝试获取 $_SESSION
的值,它将为您提供'undefined variable' notice
。
$_SESSION 超级全局始终可用,无论您是否启动会话。唯一的区别是,如果您从未在代码中执行session_start()
,或者没有通过.ini设置自动启动会话,则当脚本退出时,您放入 $_SESSION 的任何内容都将丢失。
这同样适用于所有超全局变量 - 它们始终可用。即使脚本是通过 GET 查询调用的,也有一个 $_POST 数组,并且有一个 $_COOKIE 数组,即使您在命令行上调用脚本而看不到 Web 服务器。