PHP静态类成员范围

时间:2012-06-22 21:27:15

标签: php oop scope static-members

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

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

我目前的理解是,一切都是请求,除非它被卡在会话上。我在Language Guide中没有发现任何反驳或证实此事的内容。

实施例

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) 正确吗?

2 个答案:

答案 0 :(得分:5)

除非您使用会话,否则PHP不会保留任何信息。因此,当您加载页面时,会在代码的开头创建一个变量,并在代码结束时将其发送出去。

与班级及其成员相同。你可以根据需要编辑它们,它会保留信息,但是在你脚本的最后,它会丢失。

答案 1 :(得分:1)

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

是的,有几种机制可以减少这种'无国籍状态' - 存储在客户端的cookie;会话,使用cookie或一些参数作为存储在服务器端的信息的密钥。但总的来说,你的理解是非常正确的:PHP使用的每个实体的时间跨度(不存储在DB /文件或会话中)只是请求