我目前正在從基于服務器上的檔案系統的 PHP 內置會話管理和類似的東西$_SESSION切換session_start()到我自己的方法(我知道那里有 symfony 等框架,但我的應用程式很可能會做同樣的事情非常基本的東西,不再需要,所以在我看來,沒有必要為此依賴擴展)。
我只是計劃使用傳統的會話管理方法(
為了有效地使用這種方法,我在 PHP 中尋找一種方法來將資料傳遞給位于范圍內的變數,該范圍可用于運行時呼叫的所有回呼,但仍具有一定的范圍/受保護。就像$_SESSION或任何其他超全球一樣,但另外滿足以下標準:
- 資料/陣列鍵沖突的機會必須最小;所以默認情況下該變數理想地為空
- used 變數不應鏈接到任何其他存盤系統,例如
$_SESSION系結到服務器的檔案系統(或您在會話處理程式中指定的任何內容) - used 變數應專門用于此,僅可用于呼叫腳本,并在腳本運行后死亡
考慮到所有這些,我目前正在考慮使用類似的東西$_ENV[prefix_udata],填充從每個請求的影像的步驟 4a 收集的資料。$_SESSION['uid']這將避免我需要通過簡單地替換諸如with之類的東西來向所有回呼添加額外的代碼或額外的引數$_ENV['uid']。
我只是想仔細檢查一下,$_ENV它不依賴于外部存盤系統,只在運行時可用,并且只與運行請求相關。我的研究讓我得出這樣的結論。但更好的雙重檢查..?
uj5u.com熱心網友回復:
您不能創建自己的超全域變數,它們每個都有一個明確的用途——$_ENV用于從腳本的“環境”傳遞的值,例如 Web 服務器提供的資訊。將其重新用于不同的目的似乎不是一個好主意,只是為了利用其特殊的范圍規則。
但是,您可以創建普通的全域變數,并使用global關鍵字或通過superglobal$GLOBALS訪問它們。
因此,如果您創建一個名為 的全域變數$my_session_array,您可以簡單地將所有代碼替換$_SESSION['foo']為$GLOBALS['my_session_array']['foo'],并且無需濫用用于其他目的的超全域變數。
另一種選擇是在類上使用靜態屬性。與全域變數一樣,可以從請求中的任何位置訪問公共靜態屬性。
例如,如果你定義這個:
class MySession {
public static $sessionData = [];
}
然后你可以$_SESSION['foo']用MySession::$sessionData['foo'].
這兩種方法都有與共享全域狀態相關的所有問題——使用它的代碼通常比根據顯式輸入和輸出定義的代碼更難測驗和除錯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/495486.html
上一篇:會話處理在PHP上沒有正確設定
