




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Web應(yīng)用安全第五章MVC模式本章要求1理解面向?qū)ο缶幊痰南嚓P(guān)概念和實(shí)現(xiàn)方法2理解MVC編程的基本思想3掌握MVC編程的一般過(guò)程23面向?qū)ο缶幊袒A(chǔ)面向?qū)ο缶幊蹋∣bjectOrientedProgramming,OOP)是一種計(jì)算機(jī)編程架構(gòu),它的一條基本原則是計(jì)算機(jī)程序由單個(gè)能夠起到子程序作用的單元或?qū)ο蠼M合而成。采用面向?qū)ο缶幊趟枷肟梢詫?shí)現(xiàn)軟件工程的三個(gè)主要目標(biāo):重用性、靈活性和擴(kuò)展性。面向?qū)ο缶幊讨饕攸c(diǎn)封裝性:將對(duì)象的成員屬性和成員方法結(jié)合成一個(gè)獨(dú)立的單元,以隱蔽對(duì)象的內(nèi)部細(xì)節(jié),PHP語(yǔ)言通過(guò)類(lèi)和對(duì)象實(shí)現(xiàn)封裝;繼承性:建立的一個(gè)新的派生類(lèi)時(shí),從一個(gè)先前定義的類(lèi)中繼承屬性和方法,同時(shí)可以重新定義或加進(jìn)新的屬性和方法,PHP語(yǔ)言支持單繼承;多態(tài):同一類(lèi)的同一成員方法輸入不同類(lèi)型的參數(shù),或者具有繼承關(guān)系的類(lèi)多個(gè)類(lèi)對(duì)同一成員方法,可以有不同的行為和實(shí)現(xiàn)。4面向?qū)ο缶幊袒A(chǔ)對(duì)象和類(lèi)對(duì)象定義及內(nèi)涵對(duì)象就是描述客觀事物的一個(gè)實(shí)體,如張三、桌子、圖書(shū)、電腦等每一個(gè)對(duì)象都有特定的數(shù)據(jù)模型,用于描述對(duì)象的一些具體數(shù)據(jù),如姓名、年齡、身高、體重等,這些數(shù)據(jù)稱為對(duì)象的屬性,也叫對(duì)象的成員變量。每一個(gè)對(duì)象有特定的行為模型,用于描述對(duì)象的行為能力或功能,稱為對(duì)象的方法。類(lèi)定義及內(nèi)涵類(lèi)則是對(duì)一類(lèi)對(duì)象的抽象,如人、圖書(shū)等5面向?qū)ο缶幊袒A(chǔ)對(duì)象和類(lèi)定義一個(gè)類(lèi)class類(lèi)名稱{
屬性1;
屬性i...;
方法1(){}
方法j...(){}}classPerson{
public$name;//姓名
public$sex;//性別
public$age;//年齡
publicfunctionsayHello(){
print("Hello!<br>");
}
publicfunctionwork(){
print("Iamworking......<br>");
}}6面向?qū)ο缶幊袒A(chǔ)對(duì)象和類(lèi)實(shí)例化類(lèi)為對(duì)象<?phpclassPerson{
public$name;//姓名
public$sex;//性別
public$age;//年齡
publicfunctionsayHello(){
print("Hello!<br>");
}
publicfunctionwork(){
print("Iamworking......<br>");
}}$zhangsan=newPerson();$zhangsan->name="zhangsan";$zhangsan->sex="male";$zhangsan->age="18";$zhangsan->sayHello();//Hello!$zhangsan->work();//Iamworking......?>7面向?qū)ο缶幊袒A(chǔ)對(duì)象和類(lèi)構(gòu)造函數(shù)和析構(gòu)函數(shù)classPerson{public$name;//姓名public$sex;//性別public$age;//年齡function__construct($name,$sex,$age){$this->name=$name;$this->sex=$sex;$this->age=$age;}
function__destruct(){
print("Destroyinganobject......<br>");
}}$zhangsan=newPerson("zhangsan","male",18);print("Name:".$zhangsan->name."<br>");//zhangsanprint("Sex:".$zhangsan->sex."<br>");//maleprint("Age:".$zhangsan->age."<br>");//18//Destroyinganobject......沒(méi)有顯性的方法調(diào)用--魔術(shù)方法8面向?qū)ο缶幊袒A(chǔ)對(duì)象和類(lèi)$this屬性classPerson{public$name;//姓名public$sex;//性別public$age;//年齡function__construct($name,$sex,$age){$this->name=$name;$this->sex=$sex;$this->age=$age;}
functioninfo(){
//print($name);//這樣的方式將報(bào)錯(cuò),變量$name沒(méi)有定義
print("Name:".$this->name."<br>");
print("Sex:".$this->sex."<br>");
print("Age:".$this->age."<br>");
}}$zhangsan=newPerson("zhangsan","male",18);$zhangsan->info();//zhangsan,male,18$this屬性在對(duì)象創(chuàng)建時(shí)指向?qū)ο蟊旧?面向?qū)ο缶幊袒A(chǔ)繼承和重載繼承是指一個(gè)類(lèi)可以擁有其他類(lèi)中聲明的屬性和方法的機(jī)制。被繼承的類(lèi)稱為父類(lèi),繼承的類(lèi)稱為子類(lèi)。PHP語(yǔ)言支持單繼承。classStudentextendsPerson{
public$id;
function__construct($name,$sex,$age,$id){
$this->id=$id;
parent::__construct($name,$sex,$age);
}
publicfunctioninfo(){
print("MyID:".$this->id."<br>");
print("Myname:".$this->name."<br>");
print("Myage:".$this->age."<br>");
}}$zhangsan=newStudent("zhangsan","male",18,201901009);$zhangsan->sayHello();//Helloeveryone,I'amzhangsan!$zhangsan->work();//Iamworking......$zhangsan->info();//201901009,zhangsan,1810面向?qū)ο缶幊袒A(chǔ)繼承和重載類(lèi)在繼承過(guò)程中,還可以重新聲明父類(lèi)中的屬性和方法,這種機(jī)制稱為重載。classA{
public$attr="Defaultvalue";
publicfunctionoperation(){
print("Something<br>");
print('Thevalueof$attris'.$this->attr."<br>");
}}classBextendsA{
public$attr="Differentvalue";
publicfunctionoperation(){
print("Somethingelse<br>");
print('Thevalueof$attris'.$this->attr."<br>");
}}$a=newA();$a->operation();//Something//Thevalueof$attrisDefaultvalue$b=newB();$b->operation();//Somethingelse//Thevalueof$attrisDiffrentvalue11面向?qū)ο缶幊袒A(chǔ)訪問(wèn)控制—屬性和方法所有屬性或方法的默認(rèn)訪問(wèn)修飾符是public。被public標(biāo)記的屬性或方法稱為公有屬性或方法,它可以在類(lèi)的內(nèi)部和外部訪問(wèn),可以被子類(lèi)繼承。publicprivate被private標(biāo)記的屬性或方法稱為私有屬性或方法,它只能在類(lèi)的內(nèi)部訪問(wèn),不能被子類(lèi)繼承。protected被protected標(biāo)記的屬性或方法稱為受保護(hù)屬性或方法,它只能在類(lèi)的內(nèi)部訪問(wèn),可以被子類(lèi)繼承。12面向?qū)ο缶幊袒A(chǔ)文件的自動(dòng)裝載在很多情況下,為了保持代碼的整潔,類(lèi)定義在一個(gè)單獨(dú)的文件中,在使用這些類(lèi)的定義之前,需要使用文件包含語(yǔ)句(如include)把相應(yīng)的文件包含進(jìn)來(lái)。classA{/*文件路徑:./Class/ClassA.php*/
public$attr;
publicfunctiontest(){
print("ClassA.<br>");
print($this->attr);
}}include("./Class/ClassA.php");$a=newA();$a->attr="abc";$a->test();通過(guò)顯示文件包含實(shí)現(xiàn)類(lèi)文件裝載不足之處:(1)手工添加;(2)可能有一些文件不必要裝載13面向?qū)ο缶幊袒A(chǔ)文件的自動(dòng)裝載自動(dòng)裝載機(jī)制<?phpfunctionmy_autoload($name){print("自動(dòng)裝載類(lèi)-{$name}的源代碼文件!<br>");$file="./Class/Class".$name.".php";include_once($file);}spl_autoload_register("my_autoload");print("程序開(kāi)始執(zhí)行......<br>");$a=newA();print("類(lèi)A的對(duì)象創(chuàng)建成功!<br>");$a->attr="abc";$a->test();?>按需、自動(dòng)裝載文件14面向?qū)ο缶幊袒A(chǔ)其他常見(jiàn)關(guān)鍵字static—靜態(tài)通過(guò)關(guān)鍵字static來(lái)標(biāo)識(shí)的類(lèi)屬性或方法,則它們?yōu)殪o態(tài)的,即這些屬性或方法不需要依賴于對(duì)象。<?phpclassA{publicstatic$count=0;publicfunction__construct(){self::$count++;}publicstaticfunctiongetCount(){returnself::$count;}}print(A::$count);//0$a1=newA;print(A::getCount());//1$a2=newA;print($a2->getCount());//2?>15面向?qū)ο缶幊袒A(chǔ)其他常見(jiàn)關(guān)鍵字instanceof--用于確定一個(gè)對(duì)象是類(lèi)的實(shí)例或子類(lèi)<?phpclassA{ public$a;}classB{ public$b;}classCextendsA{public$c;}$a=newA;$b=newB;$c=newC;if($ainstanceofA){//輸出--A類(lèi)的對(duì)象
print("A類(lèi)的對(duì)象<br>");}else{print("不是A類(lèi)的對(duì)象<br>");}if($binstanceofA){//輸出--不是A類(lèi)的對(duì)象
print("A類(lèi)的對(duì)象<br>");}else{print("不是A類(lèi)的對(duì)象<br>");}if($cinstanceofA){//輸出--A類(lèi)的對(duì)象
print("A類(lèi)的對(duì)象<br>");}else{ print("不是A類(lèi)的對(duì)象<br>");}?>16MVC編程基本原理—概念MVC是模型(Model)、視圖(View)和控制器(Controller)的簡(jiǎn)寫(xiě)。視圖(View)表示用戶交互界面,簡(jiǎn)單來(lái)說(shuō)就是HTML文檔界面模型(Model)是Web應(yīng)用系統(tǒng)業(yè)務(wù)流程,是系統(tǒng)設(shè)計(jì)的核心控制器(Controller)作用可以理解為接收操作請(qǐng)求,并將模型和視圖關(guān)聯(lián)在一起,完成操作請(qǐng)求并顯示操作請(qǐng)求的結(jié)果。17MVC編程基本原理—過(guò)程單一入口路由分發(fā)控制器操作請(qǐng)求模型視圖操作響應(yīng)①②③④⑤⑥⑦⑧耦合性低重用性高可維護(hù)性高優(yōu)點(diǎn):缺點(diǎn):結(jié)構(gòu)復(fù)雜,不易掌握調(diào)試?yán)щy18MVC編程編程示例—學(xué)生成績(jī)查詢系統(tǒng)只有登錄成功的學(xué)生才能查詢成績(jī)。查詢時(shí),需要提交學(xué)生學(xué)號(hào)信息。19MVC編程編程示例—學(xué)生成績(jī)查詢系統(tǒng)
系統(tǒng)分析視圖控制器登錄界面、成績(jī)查詢初始界面、成績(jī)查詢結(jié)果初始頁(yè)面請(qǐng)求操作、登錄請(qǐng)求操作、成績(jī)查詢請(qǐng)求操作模型用戶名和密碼的數(shù)據(jù)驗(yàn)證、英語(yǔ)課成績(jī)查詢、計(jì)算機(jī)網(wǎng)絡(luò)課成績(jī)查詢、所有課程成績(jī)查詢以用戶登錄功能為例,說(shuō)明MVC開(kāi)發(fā)過(guò)程,剩余功能實(shí)現(xiàn)自行練習(xí)20MVC編程編程示例—學(xué)生成績(jī)查詢系統(tǒng)登錄功能實(shí)現(xiàn)操作請(qǐng)求參數(shù)設(shè)計(jì)GET參數(shù),?action=index&op=loginaction表示請(qǐng)求的操作,op表示請(qǐng)求的階段;如果沒(méi)有請(qǐng)求參數(shù),則設(shè)置缺省參數(shù)為action=index&op=index基本流程設(shè)計(jì)index.php(單一入口)
獲取操作請(qǐng)求參數(shù),或設(shè)置缺省操作參數(shù)
根據(jù)請(qǐng)求參數(shù)找到處理控制器的處理方法訪問(wèn)模型,驗(yàn)證用戶名和密碼返回處理結(jié)果后的視圖(成功為查詢視圖、不成功為登錄視圖)用戶請(qǐng)求路由21MVC編程編程示例—學(xué)生成績(jī)查詢系統(tǒng)登錄功能實(shí)現(xiàn)系統(tǒng)文件結(jié)構(gòu)設(shè)計(jì)Controller—控制器目錄Model—模型目錄View—視圖目錄index.php—單一入口文件app.php—系統(tǒng)核心功能文件,包括請(qǐng)求參數(shù)獲取、路由查詢和分發(fā)、文件自動(dòng)裝載等route.php—路由配置信息文件22MVC編程編程示例—學(xué)生成績(jī)查詢系統(tǒng)登錄功能實(shí)現(xiàn)<?phpdefine("SINGLE","GOON");//定義單一入口標(biāo)識(shí)require("app.php");$app=newAPP;$app->action();?>index.phproute.php<?php//基于標(biāo)識(shí)的單一入口if(!defined('SINGLE'))exit();//路由配置按照[action,op,controller,func]$routes=array(array("index","default","Index","default"),array("index","login","Index","login"),);?>23MVC編程編程示例—學(xué)生成績(jī)查詢系統(tǒng)登錄功能實(shí)現(xiàn)app.phpif(!defined('SINGLE'))exit();//基于標(biāo)識(shí)的單一入口classAPP{publicfunction__construct(){spl_autoload_register(“self::load”);//注冊(cè)自動(dòng)裝載}staticpublicfunctionload($class){//自動(dòng)裝載方法$file=“./Controller/{$class}.php”;//裝載控制器類(lèi)if(file_exists($file))require_once($file);$file="./View/{$class}.php";//裝載視圖類(lèi)if(file_exists($file))require_once($file);$file="./Model/{$class}.php";//裝載模型類(lèi)
if(file_exists($file))require_once($file);}publicfunctionaction(){//應(yīng)用請(qǐng)求處理$action=$this->getRequest();//獲取請(qǐng)求操作
$route=$this->getRoute($action);//找到路由
$this->toController($route[2],$route[3]);}
publicfunctiongetRequest(){//獲取請(qǐng)求操作$action=array("index","index");//缺省的請(qǐng)求
if(!empty($_GET['action'])){$action[0]=$_GET['action'];if(!empty($_GET["op"]))$action[1]=$_GET["op"];}return$action;}publicfunctiongetRoute($action){//請(qǐng)求分發(fā)require("route.php");//獲取路由配置信息
foreach($routesas$route){if(($route[0]==$action[0])&&($route[1]==$action[1])){return$route;}}returnarray(“”,“”,“Index”,“default”);//沒(méi)有找到路由,使用缺省頁(yè)面}publicfunctiontoController($controller,$func){//將請(qǐng)求發(fā)送給控制器$con=new$controller;$con->$func();}24MVC編程編程示例—學(xué)生成績(jī)查詢系統(tǒng)登錄功能實(shí)現(xiàn)\Controller\Index.phpif(!defined('SINGLE'))exit();//基于標(biāo)識(shí)的單一入口classIndex{publicfunctiondefault(){$con=newView("./View/index.html",array());$con->display();//展示界面}publicfunctionlogin(){session_start();$id=$_POST['id'];//學(xué)號(hào)
$pass="";if(!empty($_POST['pass']))$pass=$_POST['pass'];$model=Model::getInstance();$ret=$model->userCheck($id,$pass);if($ret){//用戶驗(yàn)證成功
$_SESSION['id']=$id;//注冊(cè)會(huì)話變量
$con=newView("./View/operate.html",array());$con->display();}else{//用戶驗(yàn)證失敗,顯示登View/index.html錄頁(yè)面
$con=newView("./",array());$con->display();//展示界面
return;}}}25MVC編程編程示例—學(xué)生成績(jī)查詢系統(tǒng)登錄功能實(shí)現(xiàn)\View\View.php<?phpif(!defined('SINGLE'))exit();//基于標(biāo)識(shí)的單一入口classView{public$file;//存放模板文件
public$data;//存放成績(jī)查詢結(jié)果
publicfunction__construct($file,$data){$this->file=$file;$this->data=$data;}//顯示頁(yè)面效果
publicfunctiondisplay(){$con=file_get_contents($this->file);$con=$con."</body></html>";print($con);}}?>26MVC編程編程示例—學(xué)生成績(jī)查詢系統(tǒng)登錄功能實(shí)現(xiàn)\View\index.html<!DOCTYPEhtml><html><head><title>歡迎登錄</title><metacharset="utf-8"></head><body><h1>歡迎訪問(wèn)學(xué)生成績(jī)查詢系統(tǒng)</h1><h3>登錄系統(tǒng)</h3><formaction="index.php?action=index&op=login"method="post"><label>學(xué)號(hào):</label><inputtype="text"name="id"><br><label>密碼:</label><inputtype="password"name="pass"><br><inputtype="submit"value="登錄系統(tǒng)"></form>27MVC編程編程示例—學(xué)生成績(jī)查詢系統(tǒng)登錄功能實(shí)現(xiàn)\View\operate.html<!DOCTYPEhtml><html><head><title>成績(jī)查詢</title><metacharset="utf-8"></head><body><h1>歡迎訪問(wèn)學(xué)生成績(jī)查詢系統(tǒng)</h1><h3>成績(jī)查詢</h3><formaction="index.php?action=grade&op=query"method="post"><label>查詢條件:</label><label>學(xué)號(hào)</label><inputtype="text"name="id"><inputtype="submit"value="開(kāi)始查詢"></form><formaction="index.php?action=grade&op=logout"method="post"><inputtype="submit"value="退出登錄"></form><hr>28MVC編程編程示例—學(xué)生成績(jī)查詢系統(tǒng)登錄功能實(shí)現(xiàn)if(!defined('SINGLE'))exit();//基于標(biāo)識(shí)的單一入口classModel{privatestatic$instance;//單例對(duì)象
publicstaticfunctiongetInstance(){//獲取單例對(duì)象
if(!(self::$
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 瀝青混合料生產(chǎn)項(xiàng)目建議書(shū)(模板范文)
- 跨境金融保障專(zhuān)題研究報(bào)告
- 廣告牌匾規(guī)范化整治實(shí)施方案(范文)
- 大學(xué)生法制教育體系構(gòu)建
- 山東輕工職業(yè)學(xué)院《流體機(jī)械》2023-2024學(xué)年第二學(xué)期期末試卷
- 寶雞文理學(xué)院《國(guó)際工程項(xiàng)目管理》2023-2024學(xué)年第二學(xué)期期末試卷
- 浙江外國(guó)語(yǔ)學(xué)院《白然語(yǔ)言處理與理解》2023-2024學(xué)年第二學(xué)期期末試卷
- 四川華新現(xiàn)代職業(yè)學(xué)院《通信網(wǎng)絡(luò)技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 西安航空職業(yè)技術(shù)學(xué)院《巖石物性測(cè)量實(shí)驗(yàn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣東科學(xué)技術(shù)職業(yè)學(xué)院《生物反應(yīng)工程基礎(chǔ)》2023-2024學(xué)年第二學(xué)期期末試卷
- 露天煤礦作業(yè)崗位責(zé)任制與操作規(guī)范
- 2025-2030國(guó)內(nèi)外骨骼機(jī)器人行業(yè)市場(chǎng)發(fā)展現(xiàn)狀及競(jìng)爭(zhēng)格局與投資前景研究報(bào)告
- 疫苗出入庫(kù)登記制度
- 融資崗專(zhuān)業(yè)考試題及答案
- 閱讀理解 20篇 集訓(xùn)-2025年人教版中考英語(yǔ)復(fù)習(xí)專(zhuān)練(含答案)
- 課程內(nèi)容中的全球化視角探討-深度研究
- 2024年新疆中考語(yǔ)文調(diào)研試卷(二)
- 智慧養(yǎng)老系統(tǒng)報(bào)價(jià)明細(xì)建設(shè)方案
- 燃?xì)?、LNG安全隱患規(guī)范依據(jù)查詢手冊(cè)
- 生物分離工程習(xí)題(含答案)
- 2025年停車(chē)場(chǎng)無(wú)償使用協(xié)議
評(píng)論
0/150
提交評(píng)論