2017-09-06 51 views
-1

我正在爲測試目的編寫一個簡單的邏輯。當一個動作方法被調用時,我將獲取作爲參數傳遞給動作的id並將其存儲在關聯數組中。我寫了一個靜態函數來處理邏輯。我還有第二個問題,我想檢查id是否已經作爲關聯數組中的鍵存在,如果是,我想增加計數器。但我可以爲這個問題提出另一個問題。這個問題的目的是靜態變量不工作。如何處理函數內部的PHP靜態類變量

class UsersController extends Controller 

static $users= Array(); 

public function show($id) 
    { 
     $this::stats($id); 
    } 

private static function stats($id) 
    { 

     if( array_key_exists("{$id}", UsersController::$users)) 
     { 
      UsersController::$users["{$id}"] += 1; 
     } 
     else 
     { 
      UsersController::$users["{$id}"] = 1; 
     } 
    print_r(UsersController::$users); 
    } 

每次訪問不同的用戶www.example.com/users/2或www.example.com/users/1。 print_r語句顯示數組中只存在一個元素。我是否缺少一些oop原理。我用C#編寫了一個類似的代碼,它的工作方式和預期的一樣。

+0

爲什麼你是否將所有內容都包含在引號中?不要使用'「{$ id}」',使用'$ id',這樣更具可讀性。此外,可以使用關鍵字'static'來代替當前的類名稱。這會在以後更容易重構。 – Devon

+0

@Devon:抱歉可能會劫持,但使用'self'還可以嗎? – Kisaragi

+1

@Kisaragi,是的,但這取決於。有時候自我更好。它在擴展類時應用不同。例如:Controller中的self將始終引用Controller。 Controller中的靜態會引用被調用的類(UsersController),允許擴展功能。 – Devon

回答

0

你不會錯過任何OOP原則,你錯過了PHP進程的標準實現。通常情況下,網絡服務器被設計爲執行php腳本然後死亡。當您訪問兩個不同的頁面時,內存中沒有持久性。

你可以實現PHP來繼續使用相同的內存嗎?當然可以,但是沒有我知道的web服務器實現以這種方式工作。

大多數人使用會話(服務器端)或cookie(客戶端)來保持跨多個請求的持久數據。

+0

是的,我的問題是因爲處理請求的方式。 –

-1

您需要將數據存儲在永久存儲器中以通過多個請求持續存在。

每個PHP請求都是全新的執行。因此,如果它是你的C#代碼,那就好像你退出了C#程序,重新啓動了它並與第二個用戶一起訪問。

與PHP永久存儲的常用來源包括像其存儲在一個文件,數據庫等

如果該數據的存儲可以是每個用戶,而不是一個大問題,如果失去了選擇,你可以存儲會話中(存儲在服務器上,通常是文件中)或cookie(存儲在客戶端的瀏覽器中)。這些存儲介質都不是非常可靠的,被認爲是暫時的。

還有更臨時數據存儲的形式,並且它們包括像內存緩存(獨立存儲器基於存儲介質),redis的(同上),APCu(可以內置PHP作爲模塊)等