何时共享静态类变量?

时间:2015-07-24 04:51:51

标签: php oop static

我对Wordpress环境中PHP静态类变量的理解是,如果同一个类中的2个或更多个对象在同一个http请求中实例化,那么它们的类静态变量将被共享。

不同的 http请求怎么样?类静态变量是否曾在 http请求之间共享?或者是为每个http请求创建的对象的全新副本?

2 个答案:

答案 0 :(得分:4)

不,他们没有分享。在每个请求上,都会创建新对象。请记住,HTTP是无状态协议。这就是为什么很多人认为Singleton是反模式的(1)

所以,基本上如果你有以下代码:

<?php

class MyClass {

    public function __construct() {
        // any action
    }

    public function anyMethod() {
        // any code
    }

}

$obj = new MyClass;
为每个请求从头开始创建

$obj。实际上,这不是一切。您的整个应用程序都是从头开始“创建”的。

1)Why is Singleton considered an anti-pattern?

答案 1 :(得分:2)

TL; DR :否。静态/全局状态在http请求之间不会持续存在。

你需要了解一个类和一个对象之间的区别来回答你的问题。

类是创建单个对象的模板。类本身是静态的,这意味着它具有全局范围。在您宣布课程后,您可以在当前流程的代码中的任何位置执行new Class

对象是类的实例。它只能通过包含它的变量(指针)来访问。

现在static关键字是什么意思?基本上,当您声明静态属性时,您声明了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服务器收到新请求时,它都会启动一个 new PHP进程,该进程将执行指定的脚本。因此,全局状态不会在http请求之间持续存在,因为每个请求都在自己的PHP进程中执行。