PHP中静态成员的作用域和并发性

PHP中静态成员的作用域和并发性,php,concurrency,static,scope,member,Php,Concurrency,Static,Scope,Member,我有一个在我的应用程序中声明的类,它有一个私有静态成员,如下所示: class SomeClass{ private static myMember = array(); public static getterFunction(){} public static setterFunction(){} } 我的问题/担忧是,多个请求(我认为就像Java中的线程一样)将能够修改这个静态成员。我对php作用域和静态成员的理解是,它们位于请求作用域中,为每个新请求创建一个新变量,然后在请求完

我有一个在我的应用程序中声明的类,它有一个私有静态成员,如下所示:

class SomeClass{
private static myMember =  array(); 

public static getterFunction(){}
public static setterFunction(){}

}
我的问题/担忧是,多个请求(我认为就像Java中的线程一样)将能够修改这个静态成员。我对php作用域和静态成员的理解是,它们位于请求作用域中,为每个新请求创建一个新变量,然后在请求完成后销毁。这就是说,这将是一件很难测试的事情(至少我想不出一个简单的方法),所以我宁愿安全也不后悔

我的评估正确吗?我读过的PHP文档在细节方面非常糟糕,所以我还不能权威地回答…

除非您明确地这样做(例如使用会话、数据库、文件、共享内存),否则没有数据、没有数据是持久的或在不同的PHP脚本实例之间共享的。每个PHP实例都是自己的,每个新请求都会导致Web服务器启动一个单独的实例


是的,你是正确的。

在PHP中,默认情况下没有共享内存。每个请求都是在单独的进程中处理的,所以他们彼此不了解

我希望我正确理解了你的问题

例如:

您有一个简单的script.php文件,它在传递GET参数时在类中设置私有字段:

<?
class A {
  private $x = 1;
  public function setX($x) {$this->x = $x;}
  public function getX() {return $this->x;}
}

$a = new A();
if (!empty($_GET['x'])) {
  $a->setX($_GET['x']);
  sleep(3);
}

echo $a->getX();
?>

第二个请求将打印“1”。是的,你说得对

谢谢你,伙计。我很感激在这件事上有比我更多的眼球。@deceze你从哪里得到这些信息的?我并不怀疑这一点,但PHP文档通常非常不具体,很难获得关于细节的权威信息。@Elmar我甚至不能告诉你这一点。它是PHP工作方式的基础,我不知道在任何地方都提到过它有多明确。
GET /script.php?x=5
GET /script.php