2010-03-09 101 views
3

這可能有點愚蠢的問題,但我不是來自面向對象的背景,雖然我正在閱讀和學習,我仍然在努力與一些概念。PHP如何跟蹤創建的對象?

現在我正在使用PHP 5.3並使用幾個不同的對象類設計一個相當簡單的登錄:定義用戶的用戶。啓動和維護會話數據以及是否有人登錄的會話,以及執行查詢的數據庫。

所以,當我的腳本運行時,我的會話對象被實例化,等等......這是我的問題。當我從一個頁面移動到下一個頁面時,該對象是如何跟蹤的?或者更確切地說,我的問題是,PHP如何知道與我的登錄相關的對象是我的,而不是其他人登錄該網站的?

我知道如果我以非OOP方式進行此操作,我只需在每個頁面上檢查會話cookie並以這種方式檢查我的數據,這是我的大腦可以處理的。但是,在何處以及如何跟蹤對象數據。

EG: 在每一頁我想檢查是否有人登錄我參考$ session-> is_logged_in()等is_logged_in檢查一個私人變量名是真或假。 這裏沒有檢查cookie,這意味着這個對象仍然存在,並且,當它不斷詢問一個存儲的變量時,實例必須堅持有用......但PHP,服務器,無論如何與那個實例綁定反對那個用戶?如果所有這些對象都在服務器上浮動,直到我銷燬它們,那麼對象所使用的內存不會很多嗎?

正如我剛開始說的那樣,這可能是一個非常基本的基金問題,但我還沒有找到我的靈感來源,我可能會回到更簡單的PHP。

回答

5

會話數據(即$ _SESSION中的所有數據)默認被序列化並存儲到請求之間的文件中。當調用session_start()時,數據會自動反序列化。

PHP manual on Session Handling(重點煤礦):

的會話支持允許用戶註冊任意數目的變量跨越請求予以保留。當訪問者訪問您的站點時,PHP會自動檢查(如果session.auto_start設置爲1)或您的請求(顯式地通過session_start()或通過session_register())隱式檢查特定會話ID是否與請求一起發送。如果是這種情況,則先前保存的環境是重新創建

請求之間的內存中沒有任何東西存在。 PHP具有無共享體系結構,這意味着除非使用專用緩存機制,否則每次請求都會重新創建所有對象。

+1

謝謝戈登,我想我的大腦的一部分仍然覺得很難接受對象的角色。我回去檢查代碼以遵循其邏輯。 我很欣賞會話會做什麼,但我忘記了我的__construct方法,它調用另一個函數來檢查我的會話是否設置。 所以是的,對象正在做我在其他地方做的事情,只是以不同的方式完成,也就是說,只需加載包含文件然後填充會話數據即可重新創建對象。 感謝您讓我通過我所說的來思考,現在我對它有了更好的把握。 – TooManyCooks 2010-03-09 15:14:03

2

所以當我的腳本運行時,我的會話對象被實例化等等...這是我的問題 雖然。當我從一個頁面移動到下一個頁面時,該對象是如何跟蹤的?或者更確切地說 我的問題是,PHP如何知道與我的登錄相關的對象是我的,而不是 登錄該網站的其他人?

當你開始一個會話時,會產生一個id。所有會話數據都與該ID相關聯,並將其發送給瀏覽器以存儲在cookie中。隨後的請求會在Cookie中包含該ID,並且PHP會將數據從it has stored it中抽出。

如果所有這些對象都在服務器上四處浮動,直到我摧毀它們,那麼不會有很多對象使用的內存嗎?

將對象序列化爲文件而不是保存在RAM中,並在會話過期時進行清理。

0

我發現有些時候,當我開始對什麼是真的「正在發生」失去視野時,快速瀏覽一個帶有phpinfo();的頁面,或者只是記錄一些ENV變量常常會清除所有東西,並讓我回到正軌。

Globals讓你看到你的環境中究竟是什麼「存在」,並允許你對你正在「合作」的東西進行精神補充,以及如何最好地攻擊挑戰..你會發現財富的信息,併爲您的具體「問題」有這樣的條目...

$_SERVER["HTTP_COOKIE"]
$_SERVER["QUERY_STRING"]
$_SERVER["argv | c"]
$include_path

等等

也,它絕不會傷害通過閱讀你/etc/php.ini(何情況而定)的小單對一次性使用PHP的內部 - 提醒你「它是什麼」。