我对Wordpress环境中PHP静态类变量的理解是,如果同一个类中的2个或更多个对象在同一个http请求中实例化,那么它们的类静态变量将被共享。
不同的 http请求怎么样?类静态变量是否曾在 http请求之间共享?或者是为每个http请求创建的对象的全新副本?
答案 0 :(得分:4)
不,他们没有分享。在每个请求上,都会创建新对象。请记住,HTTP是无状态协议。这就是为什么很多人认为Singleton是反模式的(1)。
所以,基本上如果你有以下代码:
<?php
class MyClass {
public function __construct() {
// any action
}
public function anyMethod() {
// any code
}
}
$obj = new MyClass;
为每个请求从头开始创建 $obj
。实际上,这不是一切。您的整个应用程序都是从头开始“创建”的。
答案 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进程中执行。