1

让我先说一下,我来自 Java 背景。

PHP中静态类成员的范围是什么?即:请求、会话、服务器生命周期等

我目前的理解是,除非卡在会话中,否则一切都是请求。我在语言指南中没有发现任何反驳或证实的内容。

例子

class MyKlass {
    public static $K_PAGE_SIZE = 50;
    public static $K_WITH_SPRINKLES = true;
}

if (isset($_GET['NO_SPRINKLES'])) {
    MyKlass::$K_WITH_SPRINKLES = false;
}

var_dump(MyKlass::$K_WITH_SPRINKLES);

情况1

如果我要访问带有此代码的页面,而查询行中没有任何内容,我应该会看到

bool(true)

案例2

如果我要使用此代码访问页面并?NO_SPRINKLES=true在查询行中,我应该看到

bool(false)

案例3

如果我访问?NO_SPRINKLES=true查询行中的页面,然后访问没有它的页面,我应该总是看到 bool(true) 对吗?

案例4

使用 访问页面后,访问该页面的?NO_SPRINKLES=true其他人应该仍然看到 bool(true) 正确?

4

2 回答 2

5

除非您使用会话,否则 PHP 不会保留任何信息。因此,当您加载页面时,会在代码开头创建一个变量,并在发送代码时在代码末尾销毁。

与类及其成员相同。您可以随意编辑它们,它会保留信息,但在脚本的最后,它会丢失。

于 2012-06-22T21:32:45.533 回答
2

这不是关于 PHP,而是关于 HTTP 请求-响应周期。看,HTTP 被明确定义为无状态协议。这意味着每个新请求都会被处理,因为它之前没有任何内容(之后也将什么都没有,但这听起来太悲观了)。

是的,有几种机制可以减少这种“无状态”——cookie,它们存储在客户端;会话,它使用 cookie 或某些参数作为存储在服务器端的信息的键。但总的来说,您的理解是非常正确的:PHP 使用的每个实体的时间跨度(不存储在数据库/文件或会话中)只是一个Request

于 2012-06-22T21:33:00.643 回答