PHP和并发中静态成员的范围

时间:2012-12-13 17:56:40

标签: php concurrency static scope member

我有一个在我的应用程序中声明的类,它有一个像这样的私有静态成员:

class SomeClass{
private static myMember =  array(); 

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

}

我的问题/担心是多个请求(我想像Java中的一个线程)将能够修改这个静态成员。我对php范围和静态成员的理解是它们在请求范围内,并为每个新请求创建一个新变量,并在请求完成后随后销毁。也就是说,这将是一个难以测试(至少我想不出一个简单的方法),所以我宁愿安全而不是抱歉。

我的评估是否正确?我读过的PHP文档在细节方面非常糟糕,所以我还没有能够权威地回答......

2 个答案:

答案 0 :(得分:2)

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

是的,你是对的。

答案 1 :(得分:0)

默认情况下,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();
?>

您一次执行两项请求:

GET /script.php?x=5
GET /script.php

第二个请求会打印出“1”。是的,你是对的!