2010-12-08 65 views
0

現在我需要使用php,上次我使用它時,它是簡單的過程腳本。 現在,它支持面向對象的,如果我在頁X關於面向對象的幾個問題PHP

  1. 每次這是否刷新頁面X將從頭再來發起對象的同一個用戶發起對象怎麼樣例如簡單的網絡行爲?
  2. 如果我從第X頁的類Foo啓動對象,並在此對象中將值設置爲靜態變量。 我可以在頁面Y獲得這個變量值與出發類Foo。只需使用Foo :: staticVar獲取它們即可。
+0

*(參考資料)* [PHP手冊在OOP靜態關鍵字](http://de3.php.net/manual/en/language.oop5.static.php) – Gordon 2010-12-08 09:27:22

+0

閱讀評論後,我仍然徘徊爲什麼我在web開發中需要oop ... – user63898 2010-12-10 21:33:00

回答

3
  1. 是。
  2. 不,如果按頁面Y表示來自客戶端的單獨請求。

頁面請求之間持續數據的唯一方法是使用sessions(或cookie)。您創建的任何對象以及對靜態類變量(或通常稱爲的字段)所做的任何更改都將丟失。

你可能需要做的是存儲一些信息作爲會話數據(使用$_SESSION superglobal;請參閱上面的鏈接),並使用它在每個請求開始時初始化對象和靜態字段。

這很容易通過一個單獨的PHP文件完成,該文件處理您的所有初始化。例如,你可以在所有腳本的開始,如果你想堅持Foo類型的對象包括這樣的:

<?php 

session_start(); 

// Get some session data that you've previously set. 
if (isset($_SESSION['foo'])) 
{ 
    $foo = $_SESSION['foo']; 
} 
else 
{ 
    // Hasn't been initialized, so do so now. 
    $foo = new Foo(); 
    $_SESSION['foo'] = $foo; 
} 

?> 

我會小心在會話中存儲數據對象以這種方式,不過,因爲它與HTTP協議的無狀態相反。最好在會話中存儲最少的信息,從中可以重建應用程序的狀態。例如,您可能只存儲當前登錄的用戶的ID,而不是整個對象,然後在每個請求上重新初始化該ID。正如評論中所提到的那樣,您想要以這種方式堅持的任何對象也必須實現__sleep and __wakeup方法。

也許值得閱讀關於this question的一些討論。

1
  1. 是的,靜止無功必須是公開的(不是私人或保護)
0
  1. 是的,對每個請求重新創建對象。一個php腳本,即使是面向對象的腳本也不知道任何以前的請求,並且每個請求都會分析和創建所有變量/對象(甚至是函數和類)。

  2. 現在這取決於你的意思是頁面X和頁面Y: 假設X和Y是以某種方式都在同一請求期間執行的php文件,那麼答案當然是肯定的。 另一方面,如果它們表示不同的請求,那麼否,因爲頁面Y不知道頁面X的請求是否已經發生,甚至更少關於已執行或未執行的代碼的性質。

0

PHP的基本性質並沒有改變 - 你還是先從每個HTTP請求一個新的PHP程序,讓你的對象將需要重新實例化在每個頁面載入。

但是,通過將對象的序列化副本存儲在$_SESSION中,然後在後續頁面加載中從序列化副本加載它,可以避免重建和重新加載數據的一些開銷。