我正在寻找静态变量不存储在PHP请求之间的保证。以下以前的问题:
跨多个.php页面的 PHP 静态变量
php 中的静态变量是否在请求中持续存在?
跨会话的静态变量
明确地说它们不是,但它们更多的是在提供一种维持状态的方法的背景下,而不是对预期行为的具体讨论。
例如,如果我有如下PHP代码:
function myfunc()
{
static $a=0;
print $a++;
}
for ($i=0;$i<10;$i++) myfunc();
然后我每次运行它时都会得到 0123456789 的输出。我对PHP的直觉/理解使我相当确定必须如此。
在我自己的实验中,我已经关闭了一个(预分叉)apache,以确保变量在请求之间不会被记住。正如我所期望的那样,在请求之间不会记住它。但这只是 PHP 运行的一种场景。
我正在寻找的是:
指向官方文档的链接,该文档指出这是预期行为,不会更改。相关的PHP文档没有明确提到这一点(除了在注释中)。
或者,当静态变量在请求中被记住时的示例,例如Web服务器或性能增强PHP框架,这些框架可能不会清除静态变量以提高请求之间的速度。
PHP 不会在请求之间保留应用程序状态。 在 PHP 应用程序生命周期中,应用程序会随着每个请求而全新执行。 静态变量用于在执行离开局部函数作用域时保留局部函数作用域中的变量值。 文档中没有任何地方提到静态变量旨在跨请求保留值。
是的,你是对的,静态变量或 PHP 中除 $_SESSION 以外的任何变量只能通过一个请求生存。但是您可以使用 _SESSION 美元来做到这一点;
class MyClass
{
public static $a = 0;
public static init()
{
self::$a = isset($_SESSION['a']) ? $_SESSION['a'] : 0;
}
public static printA()
{
self::increaseA();
print(self::$a);
}
public static increaseA()
{
self::$a++;
$_SESSION['a'] = self::$a;
}
}
myClass::init();
for ($i=0;$i<10;$i++) myClass::printA();
的特殊性在于每个请求都会重新加载整个 PHP 代码。因此,静态方法/属性在每个新请求中获取其默认值。
"每个请求都会重新加载整个 php 代码"这一事实的确认是,您可以找到像数据库访问一样的持久方法,以避免为每个请求与数据库建立新连接(请参阅:mysql_pconnect)