PHP中的静态变量是否跨请求保持不变?

41

PHP中静态变量的陷阱

我来自Java背景,最近为一个项目转到了php。在php中,我发现了一种意外的行为。

给某个静态变量赋值的值 不会在请求之间保持持久。

我不确定这是否是预期的行为。因为在Java中,您可以始终将常用变量或常量(例如dbname、hostname、username和password)跨请求持久化,以便您不必始终从本地属性文件中读取它们。

这种行为是否正常?如果是正常的,那么是否有其他方法可以在请求之间持久化分配给变量的值?

有人能否建议我在php中更好的方法?

3个回答

26
不,尽管静态变量将保留当前请求的数值,但您需要将其添加到会话中以跨请求持续保存其值。
示例:
session_start();

class Car {
    public static $make;
    public function __construct($make) {
        self::$make = $make;
    }
}

$c = new Car('Bugatti');
echo '<p>' . Car::$make . '</p>';
unset($c);

if (!isset($_SESSION['make'])) {
    echo '<p>' . Car::$make . '</p>';
    $c = new Car('Ferrari');
    echo '<p>' . Car::$make . '</p>';
}

$_SESSION['make'] = Car::$make;

echo '<p>' . $_SESSION['make'] . '</p>';

谢谢Ross。我将把结构存储在XML中,并在会话开始时读取它并将其存储在会话中,在会话结束之前一直引用它。 - Vaibhav Kamble
Ross,数据是否会在多个请求之间保留? - Rahul Patwa
1
@RahulPatwa 如果您将数据放入会话上下文中,它将在该用户的所有请求中都可以访问。 - Ross

5
静态变量仅适用于单个请求。如果您希望数据在特定用户的多个请求之间保持持久,请使用会话变量。
这里有一个很好的入门教程: http://www.tizag.com/phpT/phpsessions.php

3

如果您开始使用跨会话的复杂数据集,您可能需要考虑将数据存储在对象中,这些对象被序列化到数据库并在会话恢复时绘制出来。

PHP中的变量并不是持久的。每次页面运行时,应用程序的流程(堆栈)都会从头到尾执行。没有任何东西在后台继续执行您的逻辑或应用程序。最接近的是会话,但您不希望在其中存储诸如db访问等信息。

您的数据库配置应该在某种配置或环境文件中,只需访问一次即可连接到数据库,一旦建立了连接,您就可以简单地查询需要的内容,并使用连接句柄标识要使用的连接。


你提出的解决方案存在IO读写操作的开销,这正是我试图通过实施此解决方案来克服的问题。我认为最终我必须将其存储在文件中,在会话开始时读取并将其存储在会话中。无论如何,谢谢 :) - Vaibhav Kamble
如果您正在考虑IO问题,请查看memcache:http://us2.php.net/manual/en/intro.memcache.php - Syntax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接