何时共享静态类变量?

4

我对在WordPress环境中使用PHP静态类变量的理解是,如果在同一HTTP请求中实例化了2个或更多相同类的对象,则它们的类静态变量将被共享。

那么不同的HTTP请求呢?类静态变量是否会在HTTP请求之间共享?还是每个HTTP请求都会创建一个全新的对象副本?

2个回答

5
没有,它们不是共享的。每次请求都会创建一个全新的对象。请记住,HTTP是无状态协议。这就是为什么许多人认为单例模式是反模式(1)的原因。
因此,如果您有以下代码:
<?php

class MyClass {

    public function __construct() {
        // any action
    }

    public function anyMethod() {
        // any code
    }

}

$obj = new MyClass;

$obj是每个请求都从头开始创建的。实际上,这还不是全部。你整个应用程序也是从头开始“创建”的。


1) 为什么单例被认为是一种反面模式?


1
问题是关于static属性的,而不是类实例化或单例模式。 - deceze
是的,我只是想说明幕后发生了什么。同样适用于static属性,因为它们也是类的一部分,对吧? - Kristian Vitozev
当然可以,只是这个例子似乎与问题没有太大关系,因此可能会让人感到不必要的困惑。 - deceze

3
TL;DR: 不行。静态/全局状态在http请求之间不会持久存在。
你需要了解类和对象的区别才能回答你的问题。
类是创建各个对象的模板。类本身是静态的,意味着它具有全局范围。一旦你声明了一个类,你就可以在当前进程的任何位置使用“new Class”。
对象是类的实例。它只能通过包含它的变量(指针)访问。
现在静态关键字的含义是什么?基本上,当你声明一个静态属性时,你声明了一个类的属性。正如我之前所说,类是唯一的和全局的,因此它的属性也将是唯一的和全局的。
class Exemple
{
    public static $foo = 42;
}

echo Exemple::$foo; // 42

$object = new Exemple;
$object2 = new Exemple;
echo $object::$foo; // 42
echo $object2::$foo; // 42

Exemple::$foo = 1;
echo Exemple::$foo; // 1
echo $object::$foo; // 1
echo $object2::$foo; // 1

另一方面,当您声明一个对象属性时,它只能通过对象访问,它包含的值将特定于该对象。
class Exemple2
{
    public $bar;
}

$object = new Exemple2;
$object2 = new Exemple2;
$object->bar = 42;

echo $object->bar; // 42
echo $object2->bar; // null

现在我们已经澄清了静态的事情,我们可以谈论http请求。

每当您的Web服务器收到新请求时,它会启动一个新的 PHP进程来执行指定的脚本。因此,全局状态不会在http请求之间持久存在,因为每个请求都在自己的PHP进程中执行。


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