2012-12-13 77 views
3

我已經有一個私有的靜態成員等,從而在我的應用程序中聲明一個類:範圍靜態成員在PHP和併發

class SomeClass{ 
private static myMember = array(); 

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

} 

我的問題/關注的是,多個請求(我在想像Java中的線程)將能夠修改這個靜態成員。我對php範圍和靜態成員的理解是,它們位於請求範圍內,併爲每個新請求創建一個新變量,並在請求完成後被銷燬。也就是說,這將是一個難以測試的事情(至少我想不出一個簡單的方法),所以我寧願安全而不後悔。

我的評估是否正確?我讀過的PHP文檔在細節方面相當糟糕,所以我還沒有能夠權威地回答...

回答

2

沒有數據,沒有,它是跨越不同的PHP腳本實例持久或共享的,除非你明確地做到這一點(例如使用會話,數據庫,文件,共享內存)。每個PHP實例都是它自己的東西,每個新的請求都會導致Web服務器啓動一個單獨的實例。

所以是的,你是對的。

+0

謝謝你。我很欣賞這個比我更多的眼球。 – Brad

+0

@deceze你從哪裏得到這些信息?不是我會懷疑它,但PHP文檔通常非常不明確,很難獲得關於細節的權威信息。 –

+0

@Elmar我甚至不能告訴你。它對PHP的工作方式非常重要,我不知道它在任何地方實際上是如何明確的。 – deceze

0

您在PHP中默認沒有共享內存。每個請求都在單獨的進程中處理,所以他們不知道彼此。

我希望我能正確理解你的問題。

例如:

你時,你得到的參數通過了設置在一個類中的私有字段一個簡​​單的script.php文件:

<? 
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」。是的,你是對的!

+0

真棒。謝謝 – Brad