PHP之MVC项目实战
本文主要包括以下內容
類文件自動加載
在PHP中使用別的類時,需要載入類文件,如果類很多的話,需要重復寫很多代碼,所以利用__autoload魔法方法實現自動加載
/*** 自動加載函數** @param $class_name string 需要的類名*/ function __autoload($class_name) { // echo $class_name, ' ';//特例$map = array('MySQLDB' => FRAME_DIR . 'MySQLDB.class.php','Model' => FRAME_DIR . 'Model.class.php');//該數組,將所有的有限的特例,類與類名的映射,完成一個列表//判斷當前所需要加載的類是否是特例類if( isset($map[$class_name])) {//存在該元素,是特例//直接載入require $map[$class_name];}//規律elseif (substr($class_name, -10) == 'Controller') {//控制器require CURR_CONT_DIR . $class_name . '.class.php';} elseif (substr($class_name, -5) == 'Model') {//模型require MODEL_DIR . $class_name . '.class.php';} }路徑管理
項目中,使用常量的形式管理路徑!
使用絕對路徑!
盡量自動獲得!
如果目錄之前進行拼湊,一定會使用到目錄分隔符!(PATH_SEPARATOR,路徑分隔符) ,不同的操作系統對目錄分隔符的支持是不同的!
windows 支持 \(反斜杠) 和 /(斜杠),默認是反斜杠\。
linux 支持 / (斜杠)
因此程序中多見 /斜杠!
除此,還有一個更好的方法:
利用 預定義 常量:DIRECTORY_SEPARATOR,目錄分隔符!
頁面跳轉
header(‘Location: url’);
優勢:在于立即跳轉!
劣勢:沒有辦法在跳轉前給出提示!
header功能是,發送響應頭信息!相應頭信息,是相應信息的一部分!通知瀏覽器應該做哪些事情的部分!但是要求,相應頭信息,要先于響應主體(相應信息的其他部分)先被發送到瀏覽器!
因此,無論如何也是看不到echo的提示:
因此,編程上建議在使用header函數時,前面不應該有任何的輸出!包含html輸出和phpecho輸出!
location.href=’url’,javascript
提示是,樣式不易控!(可以用彈出層)
但是,js的支持,需要瀏覽器支持才可以!
meta:Refresh
refresh 是刷新的意思,可以提供一個秒數,刷新的間隔!
有需要當前頁面執行結束后才會刷新,因此容易給出提示,包括提示的樣式!
因此項目中典型的提示跳轉都由 refresh完成!
格外注意:
跳轉的代碼執行結束后,腳本是沒有停止的!
因此,跳轉的代碼后邊強制腳本停止!
注冊自動加載方法
利用 系統函數:
spl_autoload_registser()
如果需要注冊的是一個函數:直接提供函數名即可
如果是方法的話:需要給出類或者對象(是否是靜態) 和 方法名!
此時需要一個數組,使用兩個元素,分別表示
array(類名或對象,方法名);
配置文件系統
一,增加一個文件,保存配置信息
二,項目運行時,將配置文件載入,就可以使用配置信息
增加配置文件
在app目錄增加一個config子目錄,用于管理配置文件:
載入配置文件
增加一個框架級別的基礎操作,載入配置信息!
在framework/Framework.class.php
增一個方法,在run方法中執行即可!
考慮獲得數據的變量:
保證保存配置信息的變量的全局性!使用$GLOBALS
使用配置信息
在基礎模型實例化MysQLDB類時需要使用
framework/Model.class.php
Cookie
瀏覽器的技術,可以在瀏覽器上保存數據的一門技術!cookie就是指的是瀏覽器上保存的數據!
PHP支持cookie技術!php可以向瀏覽器發出指令,從而將數據保存到瀏覽器上!
瀏覽器負責保存數據,而php負責控制瀏覽器保存那些數據!
(php在是使用瀏覽器上cookie技術)
保存在瀏覽器上的cookie數據,可以在瀏覽器每次項服務器請求時,都可以攜帶該數據,向服務器發出請求,此時服務器上的腳本就可以獲得該數據!
基本使用
設置cookie變量,增,改,刪
利用內部函數 setcookie完成
setcookie(名字,值)
取得cookie變量,讀
使用預定義數組變量:$_COOKIE
該變量內保存所有從瀏覽器請求時所攜帶的cookie數據!
每個元素就是一個cookie變量數據!下標是名字,值,就是值!
高級使用
1,cookie數據只能是字符串數據!
2. setcookie函數,可以完成增,修改,刪除!
不存在,則增加,存在則修改!
刪除,可以采用將值,置空的形式!
3. cookie變量的失效期
cookie數據存在有效期的概念:
默認,臨時cookie。會保存到瀏覽器關閉!
同時,支持,增加setcookie的第三個參數,來修改cookie變量的有效期。有效期的表示方式,是一個時間戳,表示到哪個時間點,失效!
php可以通過 time()函數,獲得當前的時間戳,time()增加增量的形式延長cookie時間!
4,cookie存在有效路徑的概念
cookie變量是只在當前目錄,及其后代目錄才會生效!
test/下設置
test/sub/下可以訪問
可以更改cookie數據的有效路徑:
通過setcookie的第四個參數做修改:
/表示站點根目錄有效!整站有效!
5,cookie子域名的概念
cookie是嚴格區分域名的。
支持在子域名之間是可以共享的:
利用第五個參數設置
有效期,有效路徑,有效子域名!
6,COOKIE是捕獲不了當前腳本所設置的cookie變量的!_COOKIE是,瀏覽器請求時所攜帶的所有cookie!
當前設置的在下次使用請求才好用!
問題
由于COOKIE似乎逐漸退出歷史舞臺,不再的瀏覽器對于cookie的支持也不一致,所以以后慎用吧。
session
場景:
cookie的問題
由于是數據本身是在瀏覽器端:
數據的安全性問題!
數據總要在請求時攜帶!
怎么解決,注意保持在瀏覽器的多次請求間共享數據!
將數據放在服務器端,同時是數據區分瀏覽器,在瀏覽器的多次請求間共享數據!
在服務器上,為來訪的每臺瀏覽器增加一個數據空間,然后為這些數據空間分配不同唯一的標識!為每個瀏覽器分配一個唯一的標識,該標志應該服務器端數據庫空間的標識應該一一對應
要求,瀏覽器每次請求時攜帶標識,此時服務器可以獲得標識,利用標識確定數據空間,但卻請求的所有的數據處理,都在當前的確定的空間內完成!
將服務器分配給瀏覽器的唯一標識存在瀏覽器的cookie內,可以保證瀏覽器每次來時都攜帶!
服務器為每一個新瀏覽器訪問(沒有確定標識的瀏覽器),確定 標識,和在服務器上生成一個唯一的數據空間!
基本使用
直接操作SESSION數組,就可以完成session數據的存,取!每個session數據,就對應_SESSION內的一個元素!對元素操作,就是對session數據做操作!
但是,session技術,包括生產session標識,開辟session數據空間,為瀏覽器分配session標識等等,都需要PHP的session機制支持!
因此,需要先開啟session的支持,才能操作$_SESSION變量,從而去操作session數據!
開啟:
session_start();
操作:
$_SESSION;
基本原理
瀏覽器端cookie中保存的sessionID:
當前瀏覽器第一次對服務器發出請求時,服務器不能確定瀏覽器的標識
會重新生成一個唯一標識,以cookie的形式保存到瀏覽器端!
其中默認的cookie變量名為:PHPSESSID。
該cookie標量,也被稱之為 sessionID!
當瀏覽器擁有了sessionid這個cookie變量后,接下來的請求都會攜帶該ID發出請求:
服務器的端的是session數據空間
默認情況下,php,會將保存session數據的空間,生成一個文件來完成!通過文件的名稱來區分屬于哪個ID的!
默認的被保存在服務器操作系統的臨時目錄內:
詳細介紹
自動開啟
session可以自動開啟!在當前的腳本執行之前,就完成開啟!
通過php的配置文件,修改即可!
修改為session.auto_start=1
注意,在session已經開啟的情況下再開啟,則會觸發錯誤!
因此常用@session_start();開啟;
session_start()前的輸出問題
session_start前也不應該有任何的輸出,因為可能會使用到響應頭信息(類似于header函數)
$_SESSION的使用
$_SESSION 變量只能是字符串下標數組,不支持數值下標數組!
沒有session_start時是沒有$_SESSION的。
但是語法上可以向一個普通數組一樣處理,此時不會對_SESSION內的數據做保存!
刪除session
刪除某個session數據
unset($_SESSION[‘key’]);
刪除所有的session數據
$_SESSION=array();
注意,不能unset($_SESSION);
刪除session的文件
session_destroy()
session_destroy()只刪除文件,不處理SESSION變量!因此_SESSION是有值的!
但是,一旦執行了session_destroy(),則在腳本結束,不會在執行寫操作!
如何完全刪除一個session?
將于當前session相關的數據都刪除掉。
SESSION:unset,或者_SESSION=array()
session文件: session_destroy();
cookie中的sessionID: setcookie(‘PHPSESSID’, ‘’, time()-1);
服務器端session數據的處理
處理服務器上所保存的session數據的文件
修改保存目錄
默認的保存在系統臨時目錄下,windows/temp下:
可以通過修改 php的配置。session.save_path進行修改!注意,php不能自動創建該目錄,應該由自己創建目錄
分子目錄保存session文件
每個session一個session文件,當請求變多時,session文件增多! 分子目錄保存!
通過 修改 session.save_path完成!可以配置session的子目錄級數,sessionid字符可能性等
session.save_path="1;e:/php/temp" session.hash_function=0 session.hash_bits_per_character=5利用數據庫存儲session
重寫session的存儲機制!
session面臨的問題:
1量大!難管理
2服務器多,難共享!
將session數據,放置在數據庫服務器上進行保存管理!(內存)
將session數據存入到數據庫中!
分析:
需要的工作
提供可以操作數據的功能代碼!(讀,寫,刪除)
告知php,在需要的時候,調用我們所定義的代碼!
增加六個session存儲的處理函數(方法)
<?php//定義六個函數/*** 在session開啟時執行,* 負責完成session存儲所需要資源的初始化工作!*/ function sess_open() {echo 'open<br>';//連接數據庫$link = mysql_connect('127.0.0.1:3306', 'root', 'root');mysql_query('set names utf8');mysql_query('use itcast_shop'); } /*** session_start()時,開啟session時被執行** 負責從當的session記錄中,將session數據讀取出來** @param $sess_id string 當前的sessionID** @return string session的數據,不需要序列化。如果沒有讀到則返回空字符串!*/ function sess_read($sess_id) {echo 'read<br>';//利用 select 查詢$sql = "select sess_data from `session` where sess_id='$sess_id'";$result = mysql_query($sql);if($row = mysql_fetch_assoc($result)) {return $row['sess_data'];} else {return '';} } /*** 在 腳本結束時被執行** 負責,將當前的session數據,同步寫到當前的session記錄中** @param $sess_id string* @param $sess_data string ** @return bool*/ function sess_write($sess_id, $sess_data) {echo 'write<br>';//執行寫數據的操作!//當前session記錄存在則更新sess_data,不存在則插入!$expire = time();$sql = "insert into `session` values ('$sess_id', '$sess_data', $expire) on duplicate key update sess_data='$sess_data', expire=$expire";return mysql_query($sql); }/*** 在調用了 session_destroy()系統函數時,被自動調用!\* 負責的功能時,利用當前id,刪除當前的session記錄!** @param $sess_id string** @return bool*/ function sess_destroy($sess_id) {echo 'destroy<br>';//執行 delete 操作$sql = "delete from `session` where sess_id='$sess_id'";return mysql_query($sql); }/*** 在session_start() 是執行* 負責 刪除所有的垃圾數據** @param $maxlife int 最大的生命周期** @return bool*/ function sess_gc($ttl) {echo 'gc<br>';//$now = time();$last = $now-$ttl;//$sql = "delete from `session` where expire < $last";return mysql_query($sql);} /*** 腳本結束*/ function sess_close() {echo 'close<br>'; // mysql_close();return true; }session_set_save_handler('sess_open','sess_close','sess_read','sess_write','sess_destroy','sess_gc' );利用系統函數,設置session存儲所需要的處理器,為當前定義好的 這六個函數:
session_set_save_handler();
增加一個表保存session數據
保存在文件中變成保存到數據表中!
一個文件對應 一條記錄
文件名 某個字段,sessionID
文件內容 字段,當前session數據
垃圾回收,gc
如果一條記錄(一個文件)在多久之內,沒有被使用過了,則認為該數據是垃圾!
默認的時間,是1440s秒。24分鐘!可以通過php的配置:session.gc_maxlifetime=1440
什么時候執行刪除的動作?
在session_start()時,有一定的幾率,執行垃圾回收!
默認是 1/1000 千分之一!
可以通過php修改:
- session與cookie的區別與聯系?
session 的 sessionID存在 cookie內! - session數據有效期?原因是什么?
瀏覽器關閉。
原因是保存在瀏覽器端的sessionid丟失!
默認的sessionID的cookie變量是臨時的cookie變量! - 如何持久化session?
持久化sessionID這個cookie變量!
使用函數:session_id函數得到當前的sessionID!
setcookie('PHPSESSID',session_id(),time()+3600);php還提供一個專門的修改sessionID的cookie變量的函數:
session_set_cookie_params();設置該cookie變量的選項的
在表示有效期的第一個參數,是時間周期,而不是時間戳!留意,應該在session-start()之前,就完成cookie選項的設置!
(類似于 session_set_save_handler一樣)
此外還應該保證,服務器端垃圾判定的時間要與session持久化的時間盡量一致!
session.gc_maxlifetime = 3600;
留意,少用!
- cookie禁用session是否可用?
session是基于cookie的,因此cookie禁用,session不應該可用!
如果非要用,也是可以的!
辦法是:
url上傳遞sessionID!
此時,需要修改php的配置達到目的:
1,開啟對url上傳遞的支持!將僅僅使用cookie傳遞sessionid關閉!
2,增加url上參數
session.use_trans_id=1;此時php就在瀏覽器沒有cookie使用的情況下,可以采用url進行sessionID的傳遞:
注意,php只會自動在html代碼的a連接的地址上增加url的傳遞SessionID
php代碼內的url不能自動增加!
tip:表單請求時,該參數如何傳遞!php會自動增加表單項隱藏域,name=”PHPSESSID” 值為=”session_ID()”
總結
以上是生活随笔為你收集整理的PHP之MVC项目实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 李航《统计学习方法》笔记
- 下一篇: 视频制作中的绿幕与拜耳阵列