40

php中的静态变量gotcha

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

设置为某个静态变量的值不会在 请求中保持持久性。

我不确定这是否是预期的行为。因为在 java 中,您始终可以在请求中保留非常常用的变量或说诸如 dbname,hostname,username,password 之类的常量,这样您就不必总是从本地属性文件中读取它们。

这种行为正常吗?如果它是正常的,那么是否有任何替代方法可以让我在请求中保留分配给变量的值?

有人可以建议我在 php 中执行此操作的更好方法吗?

4

3 回答 3

25

不,虽然静态变量将保留在当前请求中,但您需要将其添加到会话中以在请求中保留它的值。

例子:

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>';
于 2009-02-06T12:39:47.750 回答
5

静态变量只适用于一个请求。如果您希望数据在特定用户的请求之间保持不变,请仅使用会话变量。

对他们来说一个很好的入门 tut 位于:http: //www.tizag.com/phpT/phpsessions.php

于 2009-02-06T12:41:30.943 回答
3

如果您开始处理跨会话的复杂数据集,您可能需要考虑将数据存储在对象中,这些对象会序列化到数据库并在会话恢复时提取。

PHP 中的变量并不意味着是持久的。您的应用程序(堆栈)的流程在每个页面运行时从头到尾执行。后台没有任何东西可以继续您的逻辑或应用程序。最接近的是会话,但您不想在其中存储数据库访问等信息。

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

于 2009-02-06T13:05:50.037 回答