2011-07-18 52 views
1

我不打電話session_start()而php.ini有session.auto_start = 0

我仍然可以分配變量的範圍沒有任何錯誤?沒有設置cookie,但整個頁面範圍仍然可用。如果我沒有開始會話,PHP應該提出錯誤嗎?

+0

如果你不想讓其他開發者直接訪問'$ _SESSION',那麼你需要用一個實現了'ArrayAccess'的類來重載它,在這個類中你只要在寫入權限時拋出異常就可以會議尚未開始。此外,您可以驗證只有「變量」被設置,哪些名稱受您控制。 – hakre

回答

4

由於$_SESSION是超全球性的,它隨時在所有範圍內都可用。

僅僅因爲會話本身沒有用瀏覽器初始化,並不意味着這個變量不存在。它仍然在等待使用,並且您隨時可以隨時存儲,但我的理解是,如果您寫信給它,然後初始化會話將被清除。

編輯:

該代碼產生two => Second預期。

<?php 
     $_SESSION['test'] = "string"; 
     session_start(); 
     $_SESSION['two'] = "Second"; 

     foreach($_SESSION as $key => $val) 
     { 
       print $key . " => " . $val; 
       print "<br />"; 
     } 
?> 
2

,雖然它們在CLI定義可以分配給$argc和只;您可以分配到$_FILES,到$_SERVER,甚至到$GLOBALS。所有這些都是變量,並且PHP不會阻止您分配新值。由於它是一種動態語言,不需要變量聲明,它不會阻止你初始化變量。但是,如果您在分配任何內容之前嘗試獲取$_SESSION的值,並且在致電session_start之前,它會給您'undefined variable' notice

0

無論您是否開始會話,$ _SESSION superglobal始終可用。唯一的區別是,如果您從不在代碼中執行session_start(),或者沒有通過.ini設置自動啓動會話,則在腳本退出時,放入$ _SESSION的任何內容都將丟失。

這同樣適用於所有超全球植物 - 它們始終可用。有一個$ _POST數組,即使腳本是通過GET查詢調用的,並且還有一個$ _COOKIE數組,即使您在命令行上調用腳本時沒有webserver。