版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、PHP之MVC項目實戰(zhàn)本文主要包括以下內(nèi)容類文件自動加載 路徑管理 頁面跳轉 注冊自動加載方法 配置文件系統(tǒng) cookie session類文件自動加載在PHP中使用別的類時,需要載入類文件,如果類很多的話,需要重復寫很多代碼,所以利用_autoload魔法方法實現(xiàn)自動加載/* * 自動加載函數(shù) * * param $class_name string 需要的類名 */function _autoload($class_name) / echo $class_name, ' ' /特例 $map = array( 'MySQLDB' => FRAME_DI
2、R . 'MySQLDB.class.php', 'Model' => FRAME_DIR . 'Model.class.php' );/該數(shù)組,將所有的有限的特例,類與類名的映射,完成一個列表 /判斷當前所需要加載的類是否是特例類 if( isset($map$class_name) /存在該元素,是特例 /直接載入 require $map$class_name; /規(guī)律 elseif (substr($class_name, -10) = 'Controller') /控制器 require CURR_CONT_DIR
3、 . $class_name . '.class.php' elseif (substr($class_name, -5) = 'Model') /模型 require MODEL_DIR . $class_name . '.class.php' 路徑管理項目中,使用常量的形式管理路徑!使用絕對路徑!盡量自動獲得!如果目錄之前進行拼湊,一定會使用到目錄分隔符!(PATH_SEPARATOR,路徑分隔符) ,不同的操作系統(tǒng)對目錄分隔符的支持是不同的!windows 支持 (反斜杠) 和 /(斜杠),默認是反斜杠。linux 支持 / (斜杠)因此程
4、序中多見 /斜杠!除此,還有一個更好的方法:利用 預定義 常量:DIRECTORY_SEPARATOR,目錄分隔符!/管理路徑常量define('DS', DIRECTORY_SEPARATOR);/簡化目錄分隔符名稱長度!define('ROOT_DIR', dirname(_FILE_) . DS);/根define('APP_DIR', ROOT_DIR . 'app' . DS);/應用程序define('CONT_DIR', APP_DIR . 'controller' . DS);/控制
5、器define('CURR_CONT_DIR', CONT_DIR . PLATFORM . DS);/當前控制器define('VIEW_DIR', APP_DIR . 'view' . DS);/視圖define('CURR_VIEW_DIR', VIEW_DIR . PLATFORM . DS);/當前視圖define('MODEL_DIR', APP_DIR . 'model' . DS);/模型路徑define('FRAME_DIR', ROOT_DIR . 'fr
6、amework' . DS);/框架路徑頁面跳轉header(Location: url);優(yōu)勢:在于立即跳轉!劣勢:沒有辦法在跳轉前給出提示!header功能是,發(fā)送響應頭信息!相應頭信息,是相應信息的一部分!通知瀏覽器應該做哪些事情的部分!但是要求,相應頭信息,要先于響應主體(相應信息的其他部分)先被發(fā)送到瀏覽器!因此,無論如何也是看不到echo的提示:因此,編程上建議在使用header函數(shù)時,前面不應該有任何的輸出!包含html輸出和phpecho輸出!location.href=url,javascript提示是,樣式不易控!(可以用彈出層)但是,js的支持,需要瀏覽器支持才可
7、以!meta:Refreshrefresh 是刷新的意思,可以提供一個秒數(shù),刷新的間隔!有需要當前頁面執(zhí)行結束后才會刷新,因此容易給出提示,包括提示的樣式!因此項目中典型的提示跳轉都由 refresh完成!格外注意:跳轉的代碼執(zhí)行結束后,腳本是沒有停止的!因此,跳轉的代碼后邊強制腳本停止!注冊自動加載方法利用 系統(tǒng)函數(shù):spl_autoload_registser()如果需要注冊的是一個函數(shù):直接提供函數(shù)名即可如果是方法的話:需要給出類或者對象(是否是靜態(tài)) 和 方法名!此時需要一個數(shù)組,使用兩個元素,分別表示array(類名或?qū)ο?,方法?;spl_autoload_register(arr
8、ay('Framework', 'itcast_autoload');配置文件系統(tǒng)一,增加一個文件,保存配置信息二,項目運行時,將配置文件載入,就可以使用配置信息增加配置文件在app目錄增加一個config子目錄,用于管理配置文件: array( 'host'=>'127.0.0.1', 'port'=>'3306', 'user'=>'root', 'pass'=>'root', 'charset
9、9;=>'utf8', 'dbname'=>'itcast_shop', ),/數(shù)據(jù)庫組 'app' => array(),/應用程序項目組 'back' => array(),/后臺 'front' => array(),);載入配置文件增加一個框架級別的基礎操作,載入配置信息!在framework/Framework.class.php增一個方法,在run方法中執(zhí)行即可!考慮獲得數(shù)據(jù)的變量:保證保存配置信息的變量的全局性!使用$GLOBALS/* * 載入路徑常量
10、*/ private static function loadConfig() $GLOBALS'config' = require CONFIG_DIR . 'app.config.php' 使用配置信息在基礎模型實例化MysQLDB類時需要使用framework/Model.class.phpprotected function initLink() /require './framework/MySQLDB.class.php' / $options = array( / 'host'=>'127.0.0.1&
11、#39;, / 'port'=>'3306', / 'user'=>'root', / 'pass'=>'root', / 'charset'=>'utf8', / 'dbname'=>'itcast_shop' / ); $this->db = MySQLDB:getInstance($GLOBALS'config''database'); Cookie瀏覽器的技術,
12、可以在瀏覽器上保存數(shù)據(jù)的一門技術!cookie就是指的是瀏覽器上保存的數(shù)據(jù)!PHP支持cookie技術!php可以向瀏覽器發(fā)出指令,從而將數(shù)據(jù)保存到瀏覽器上!瀏覽器負責保存數(shù)據(jù),而php負責控制瀏覽器保存那些數(shù)據(jù)?。╬hp在是使用瀏覽器上cookie技術)保存在瀏覽器上的cookie數(shù)據(jù),可以在瀏覽器每次項服務器請求時,都可以攜帶該數(shù)據(jù),向服務器發(fā)出請求,此時服務器上的腳本就可以獲得該數(shù)據(jù)!基本使用設置cookie變量,增,改,刪利用內(nèi)部函數(shù) setcookie完成setcookie(名字,值)取得cookie變量,讀使用預定義數(shù)組變量:$_COOKIE該變量內(nèi)保存所有從瀏覽器請求時所攜帶的c
13、ookie數(shù)據(jù)!每個元素就是一個cookie變量數(shù)據(jù)!下標是名字,值,就是值!高級使用1,cookie數(shù)據(jù)只能是字符串數(shù)據(jù)!2. setcookie函數(shù),可以完成增,修改,刪除!不存在,則增加,存在則修改!刪除,可以采用將值,置空的形式!3. cookie變量的失效期cookie數(shù)據(jù)存在有效期的概念:默認,臨時cookie。會保存到瀏覽器關閉!同時,支持,增加setcookie的第三個參數(shù),來修改cookie變量的有效期。有效期的表示方式,是一個時間戳,表示到哪個時間點,失效!php可以通過 time()函數(shù),獲得當前的時間戳,time()增加增量的形式延長cookie時間!setcookie
14、('name','test',time()+60*60);4,cookie存在有效路徑的概念cookie變量是只在當前目錄,及其后代目錄才會生效!test/下設置test/sub/下可以訪問可以更改cookie數(shù)據(jù)的有效路徑:通過setcookie的第四個參數(shù)做修改:/表示站點根目錄有效!整站有效!5,cookie子域名的概念cookie是嚴格區(qū)分域名的。支持在子域名之間是可以共享的:利用第五個參數(shù)設置有效期,有效路徑,有效子域名!6,COOKIE是捕獲不了當前腳本所設置的cookie變量的!_COOKIE是,瀏覽器請求時所攜帶的所有cookie!當前設置的在下
15、次使用請求才好用!問題由于COOKIE似乎逐漸退出歷史舞臺,不再的瀏覽器對于cookie的支持也不一致,所以以后慎用吧。session場景:cookie的問題由于是數(shù)據(jù)本身是在瀏覽器端:數(shù)據(jù)的安全性問題!數(shù)據(jù)總要在請求時攜帶!怎么解決,注意保持在瀏覽器的多次請求間共享數(shù)據(jù)!將數(shù)據(jù)放在服務器端,同時是數(shù)據(jù)區(qū)分瀏覽器,在瀏覽器的多次請求間共享數(shù)據(jù)!在服務器上,為來訪的每臺瀏覽器增加一個數(shù)據(jù)空間,然后為這些數(shù)據(jù)空間分配不同唯一的標識!為每個瀏覽器分配一個唯一的標識,該標志應該服務器端數(shù)據(jù)庫空間的標識應該一一對應要求,瀏覽器每次請求時攜帶標識,此時服務器可以獲得標識,利用標識確定數(shù)據(jù)空間,但卻請求的所
16、有的數(shù)據(jù)處理,都在當前的確定的空間內(nèi)完成!將服務器分配給瀏覽器的唯一標識存在瀏覽器的cookie內(nèi),可以保證瀏覽器每次來時都攜帶!服務器為每一個新瀏覽器訪問(沒有確定標識的瀏覽器),確定 標識,和在服務器上生成一個唯一的數(shù)據(jù)空間!基本使用直接操作SESSION數(shù)組,就可以完成session數(shù)據(jù)的存,?。∶總€session數(shù)據(jù),就對應_SESSION內(nèi)的一個元素!對元素操作,就是對session數(shù)據(jù)做操作!但是,session技術,包括生產(chǎn)session標識,開辟session數(shù)據(jù)空間,為瀏覽器分配session標識等等,都需要PHP的session機制支持!因此,需要先開啟session的支持
17、,才能操作$_SESSION變量,從而去操作session數(shù)據(jù)!開啟:session_start();操作:$_SESSION;session_start(); if(isset($_SESSION'is_login') && $_SESSION'is_login' ='yes') /繼續(xù)執(zhí)行 else die('沒有登陸'); 基本原理瀏覽器端cookie中保存的sessionID:當前瀏覽器第一次對服務器發(fā)出請求時,服務器不能確定瀏覽器的標識會重新生成一個唯一標識,以cookie的形式保存到瀏覽器端!其中默認的
18、cookie變量名為:PHPSESSID。該cookie標量,也被稱之為 sessionID!當瀏覽器擁有了sessionid這個cookie變量后,接下來的請求都會攜帶該ID發(fā)出請求:服務器的端的是session數(shù)據(jù)空間默認情況下,php,會將保存session數(shù)據(jù)的空間,生成一個文件來完成!通過文件的名稱來區(qū)分屬于哪個ID的!默認的被保存在服務器操作系統(tǒng)的臨時目錄內(nèi):詳細介紹自動開啟session可以自動開啟!在當前的腳本執(zhí)行之前,就完成開啟!通過php的配置文件,修改即可!修改為session.auto_start=1注意,在session已經(jīng)開啟的情況下再開啟,則會觸發(fā)錯誤!因此常用s
19、ession_start();開啟;session_start()前的輸出問題session_start前也不應該有任何的輸出,因為可能會使用到響應頭信息(類似于header函數(shù))$_SESSION的使用$_SESSION 變量只能是字符串下標數(shù)組,不支持數(shù)值下標數(shù)組!沒有session_start時是沒有$_SESSION的。但是語法上可以向一個普通數(shù)組一樣處理,此時不會對_SESSION內(nèi)的數(shù)據(jù)做保存!刪除session刪除某個session數(shù)據(jù)unset($_SESSIONkey);刪除所有的session數(shù)據(jù)$_SESSION=array();注意,不能unset($_SESSION)
20、;刪除session的文件session_destroy()session_destroy()只刪除文件,不處理SESSION變量!因此_SESSION是有值的!但是,一旦執(zhí)行了session_destroy(),則在腳本結束,不會在執(zhí)行寫操作!如何完全刪除一個session?將于當前session相關的數(shù)據(jù)都刪除掉。SESSION:unset,或者_SESSION=array()session文件: session_destroy();cookie中的sessionID: setcookie(PHPSESSID, , time()-1);服務器端session數(shù)據(jù)的處理處理服務器上所保存的s
21、ession數(shù)據(jù)的文件修改保存目錄默認的保存在系統(tǒng)臨時目錄下,windows/temp下:可以通過修改 php的配置。session.save_path進行修改!注意,php不能自動創(chuàng)建該目錄,應該由自己創(chuàng)建目錄分子目錄保存session文件每個session一個session文件,當請求變多時,session文件增多! 分子目錄保存!通過 修改 session.save_path完成!可以配置session的子目錄級數(shù),sessionid字符可能性等session.save_path="1;e:/php/temp"session.hash_function=0sessio
22、n.hash_bits_per_character=5利用數(shù)據(jù)庫存儲session重寫session的存儲機制!session面臨的問題:1量大!難管理2服務器多,難共享!將session數(shù)據(jù),放置在數(shù)據(jù)庫服務器上進行保存管理!(內(nèi)存)將session數(shù)據(jù)存入到數(shù)據(jù)庫中!分析:需要的工作提供可以操作數(shù)據(jù)的功能代碼!(讀,寫,刪除)告知php,在需要的時候,調(diào)用我們所定義的代碼!增加六個session存儲的處理函數(shù)(方法)' /連接數(shù)據(jù)庫 $link = mysql_connect('127.0.0.1:3306', 'root', 'root
23、39;); mysql_query('set names utf8'); mysql_query('use itcast_shop');/* * session_start()時,開啟session時被執(zhí)行 * * 負責從當?shù)膕ession記錄中,將session數(shù)據(jù)讀取出來 * * param $sess_id string 當前的sessionID * * return string session的數(shù)據(jù),不需要序列化。如果沒有讀到則返回空字符串! */function sess_read($sess_id) echo 'read' /利用
24、select 查詢 $sql = "select sess_data from session where sess_id='$sess_id'" $result = mysql_ry($sql); if($row = mysql_fetch_assoc($result) return $row'sess_data' else return '' /* * 在 腳本結束時被執(zhí)行 * * 負責,將當前的session數(shù)據(jù),同步寫到當前的session記錄中 * * param $sess_id string * param $s
25、ess_data string * * return bool */function sess_write($sess_id, $sess_data) echo 'write' /執(zhí)行寫數(shù)據(jù)的操作! /當前session記錄存在則更新sess_data,不存在則插入! $expire = time(); $sql = "insert into session values ('$sess_id', '$sess_data', $expire) on duplicate key update sess_data='$sess_da
26、ta', expire=$expire" return mysql_query($sql);/* * 在調(diào)用了 session_destroy()系統(tǒng)函數(shù)時,被自動調(diào)用! * 負責的功能時,利用當前id,刪除當前的session記錄! * * param $sess_id string * * return bool */function sess_destroy($sess_id) echo 'destroy' /執(zhí)行 delete 操作 $sql = "delete from session where sess_id='$sess_id
27、'" return mysql_query($sql);/* * 在session_start() 是執(zhí)行 * 負責 刪除所有的垃圾數(shù)據(jù) * * param $maxlife int 最大的生命周期 * * return bool */function sess_gc($ttl) echo 'gc' / $now = time(); $last = $now-$ttl;/ $sql = "delete from session where expire < $last" return mysql_query($sql);/* * 腳本
28、結束 */function sess_close() echo 'close'/ mysql_close(); return true;session_set_save_handler( 'sess_open', 'sess_close', 'sess_read', 'sess_write', 'sess_destroy', 'sess_gc');利用系統(tǒng)函數(shù),設置session存儲所需要的處理器,為當前定義好的 這六個函數(shù):session_set_save_handler();增加
29、一個表保存session數(shù)據(jù)保存在文件中變成保存到數(shù)據(jù)表中!一個文件對應 一條記錄文件名 某個字段,sessionID文件內(nèi)容 字段,當前session數(shù)據(jù)create table session(sess_id varchar(32) primary key,sess_data text,expire int(11) charset=utf8;垃圾回收,gc如果一條記錄(一個文件)在多久之內(nèi),沒有被使用過了,則認為該數(shù)據(jù)是垃圾!默認的時間,是1440s秒。24分鐘!可以通過php的配置:session.gc_maxlifetime=1440什么時候執(zhí)行刪除的動作?在session_start()時,有一定的幾率,執(zhí)行垃圾回收!默認是 1/1000 千分之一!可以通過php修改:session.gc_probability=1;s
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 餐廚垃圾資源化利用的政策支持與激勵機制研究-洞察及研究
- 量子密鑰隱秘共享-洞察及研究
- 燃煤鍋爐改造工程方案
- 建筑業(yè)綠色施工技術應用方案
- 河流生態(tài)修復工程設計方案
- 道路施工現(xiàn)場照明設計方案
- 研發(fā)部安全生產(chǎn)責任制度
- 生產(chǎn)車間休息室管理制度
- 生產(chǎn)班組長日常管理制度
- 政協(xié)辦公室安全生產(chǎn)制度
- 2025年中國醫(yī)療器械SPD行業(yè)發(fā)展研究報告
- 旅游大巴司機培訓
- 胸外科胸部創(chuàng)傷急救流程
- 教育授權協(xié)議書范本
- T∕JNBDA 0006-2025 醫(yī)療數(shù)據(jù)標注規(guī)范
- 調(diào)相機本體安裝施工方案
- 血液凈化模式選擇專家共識(2025版)解讀 5
- 2025青海省能源發(fā)展(集團)有限責任公司招聘21人考試參考題庫及答案解析
- 減速機知識培訓資料課件
- 金融反詐課件
- 人事社保專員年度工作總結
評論
0/150
提交評論