(為入口文件減負,將入口文件實現的功能,挪到框架的基礎類中)
在框架目錄增加Framework.class.php
計劃:將需要初始化的公共功能,分模塊,形成框架基礎類的各個方法,分別調用執行,則可以完成項目的初始化功能。
使用靜態的方法類完成:(看成功能的集合,而不是圖紙設計對象;練習靜態使用)
注意,對魔術常量的處理
dirname()函數可以取得一個地址中的路徑部分
注意:將保存請求參數的變量,讓在所有地方都可以被訪問到。
注意:需要將保存配置信息的數組,全局化。
因此,使用時,應該找到全局的config變量:
在初始化默認平台時:
此時自動加載功能:
有函數的實現專程了 類靜態方法的實現
但是,PHP只認識一個叫__autoload()的函數,也就是php不能找到這個函數了。
處理方法:
告知php,在你需要找自動加載函數時,找我們定義的自動加載方法即可。
將一個普通函數(或者方法),注冊成自動加載功能函數
利用一個php函數:spl_autoload_register();將普通函數(方法)注冊成自動加載
參數,需要注冊的函數或者方法
參數函數:函數名即可,使用一個字符串即可
參數方法:類(對象)和方法名。使用一個數組,第一個元素類名,第二個元素方法名
spl_autoload_register(array('Framework','userAutoload));
注意:自動加載的方法應該是公共的。
在入口文件,加載Framework.class.php框架基礎類,運行run()程序運轉
index.php
判斷管理員登陸狀態
是否登陸標識(狀態)
應該如何保存登陸標識?
保存登陸標識的數據特征:
總結:需要一個在同一個浏覽器的多次請求間可以將數據傳遞(共享)處理方案。
難點就在於,php程序(凡事b/s,基於http協議),所有資源的最大生命周期就是腳本周期。
在浏覽器上記錄數據,最核心的解決方案。
cookie,session,會話技術。
setcookie()即可完成
setcookie('名字','值')
application/controller/back/AdminController.class.php
indexAction();
setcookie(名,值,有效期,有效目錄,有效域名)
setcookie第二個,只能字符串
setcookie('name',array('itcast','php'))
此時,在獲取該變量時:
$_COOKIE['info']就變成一個有2個元素的數組
<input type="text" name="info[name]">$_POST['info'] = array()
默認,浏覽器關閉,也稱臨時cookie
利用setcookie的第三個參數,則可以被配置:使用一個時間戳,來表示有效期
time()獲得當前的時間戳。做加減,得到其他時間的時間戳。
典型的設置方法
cookie是保存浏覽器端,php通過發出命令,才能在浏覽器上保存數據。
浏覽器上的cookie
利用firebug上網絡面板,監控浏覽器發出的請求與接到的響應:
在響應數據內,應該將數據發送的浏覽器端,告知浏覽器保存該cookie變量:
服務器,利用響應數據的一部分(響應頭),將設置的cookie的信息,發送到浏覽器:
在浏覽器發送的請求數據中將浏覽器認為有效的cookie攜帶到服務器端。
此時,服務器接收的該請求,發現存在cookie數據,利用這個數據,形成$_COOKIE數組,供用戶腳本使用
session與cookie,所解決的問題是相同的。
得到可以在同一個浏覽器的多次請求,將數據傳遞一個方法。
cookie劣勢:
數據直接存儲在浏覽器端,兩個顯著的問題:
方案:
在服務器上,保存數據。
如何保證數據可以在浏覽器的多次請求間傳遞,並且區分浏覽器。
在服務器端,為每個來訪的浏覽器端,都建一個獨立的數據空間。為每個數據空間分配一個唯一的標識,讓浏覽器保存這個唯一的標識。浏覽器每次請求時,攜帶標識過來,利用標識確定唯一的數據空間
總結:
session技術:將會話數據保存在服務器端,是浏覽器端保存存儲數據空間標識,浏覽器請求時攜帶標識,服務器負責利用標識,在相應的存儲空間內做數據處理。
session_start()可以開啟
利用預定義變量$_SESSION變量進行操作。增,刪,改,查都在$_SESSION上完成。
Tips;session技術時基於cookie技術,需要在cookie保存標識
在開啟session時,服務器會為浏覽器分配一個保存sessionID(session的標識)的cookie變量,保存到浏覽器端。
Tips:是一個整站有效的cookie變量
在浏覽器的接下來的請求中,都是攜帶該cookie變量,sessionID到服務器端:
默認的:php以文件的形式,保存每個獨立的數據空間的。被保存在,服務器端系統的臨時目錄內。
文件名,以當前的sessionID命名,保證空間唯一性。
可見,保存的時候是學歷惡化的結果。
兩個基本步驟:
只有$_SESSION的元素下表才能是數值型的。
unset($_SESSION['key']);刪除$_SESSION內的一個元素
如果刪除所有的session數據呢?
$_SESSION = array();
不對的:unset($_SESSION);,不會導致session數據丟失,php內部的session機制,還可以找到已經存在的處理好的session數據,將其寫到session數據空間內。
刪除session相關的存儲文件
session_destroy()函數可以完成
但是,刪除文件,$_SESSION數組內的數據還在:
但是,在執行session_destroy()後,腳本周期後的寫操作,則不執行。
如何完全刪除一個session的全部數據?
文件,$_SESSION,cookie內的sessionID變量
session_destory();
$_SESSION = array();
setcookie('PHPSESSID','',time() - 1);
典型的通過執行session_start()完成
支持,在配置文件中,自動開啟
但是,session如果重復開啟,則會報告一個錯誤:
典型的將錯誤屏蔽了即可
可以被配置:
session.save_handler php使用的session數據的處理的方式
可以改成user,表示用戶自定義
session.save_path
存儲位置不同
敏感度低,需要永久保存的數據,存到cookie內(用戶體驗)
安全性高,會話周期內存在的數據,保存到session內(數據合法性,合理性,完整性)
session可以保存各種數據類型
典型的將登陸驗證標識,保存到session中:
application/controller/back/AdminController.class.php
application/controller/back/IndexController.class.php
記錄登陸狀態
在登陸成功後,判斷是否選擇了保存登陸信息:
application/controller/back/AdminController.class.php
signinAction()
記錄什麼格式:
保密,可以被驗證
不能保存,後台登陸的信息
至少要成對,可以被驗證
設計成:
admin_id
處理過的密碼(在md5的基礎上,再加密處理)
application/controller/back/IndexController.class.php
indexAction()
模型
在AdminModel內增加一個checkByCookie()方法:
application/model/AdminModel.class.php