版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章PHP框架基礎(chǔ)(下)《PHP網(wǎng)站開發(fā)實(shí)例教程(第3版)》學(xué)習(xí)目標(biāo)/Target
掌握Composer的使用,能夠使用Composer管理項(xiàng)目。
掌握框架基礎(chǔ)搭建,能夠?qū)崿F(xiàn)App類、Request類、Response類和Container類。
掌握反射API的使用方法,能夠使用反射API實(shí)現(xiàn)反射。
掌握依賴注入的使用方法,能夠利用反射實(shí)現(xiàn)依賴注入。
熟悉框架的目錄結(jié)構(gòu),能夠說出每個(gè)目錄的作用。學(xué)習(xí)目標(biāo)/Target
掌握異常的拋出和捕獲,能夠在程序中拋出和捕獲異常。
掌握自定義異常類的實(shí)現(xiàn),能夠根據(jù)需求實(shí)現(xiàn)自定義異常類。
掌握多異常捕獲處理,能夠在程序中實(shí)現(xiàn)多異常的捕獲處理。
掌握異常嵌套的實(shí)現(xiàn),能夠在程序中使用異常嵌套。章節(jié)概述/Summary學(xué)習(xí)了第7章的框架基礎(chǔ)知識(shí)后,相信讀者已經(jīng)可以在自定義框架中實(shí)現(xiàn)指定的功能。為了讓讀者對(duì)框架有更深入的理解,本章將對(duì)框架的底層設(shè)計(jì)思想和實(shí)現(xiàn)原理進(jìn)行講解,內(nèi)容包括劃分框架目錄結(jié)構(gòu)、使用Composer管理項(xiàng)目、框架基礎(chǔ)搭建、反射和異常處理。目錄/Contents8.18.28.3劃分框架目錄結(jié)構(gòu)使用Composer管理項(xiàng)目框架基礎(chǔ)搭建8.4反射8.5異常處理劃分框架目錄結(jié)構(gòu)8.1
先定一個(gè)小目標(biāo)!熟悉框架的目錄結(jié)構(gòu),能夠說出每個(gè)目錄的作用。8.1劃分框架目錄結(jié)構(gòu)通常情況下,一個(gè)項(xiàng)目由許多不同類型的文件組成,為了更好地管理這些文件,需要?jiǎng)澐帜夸浗Y(jié)構(gòu)。為了讓自定義框架的目錄結(jié)構(gòu)更接近常用的PHP框架,本書參考Laravel框架的目錄結(jié)構(gòu),對(duì)自定義框架進(jìn)行目錄劃分,將自定義框架命名為myframe.test。8.1劃分框架目錄結(jié)構(gòu)myframe.test框架的目錄結(jié)構(gòu):├─app 框架核心目錄│├─Http HTTP請(qǐng)求目錄││├─Controllers 控制器目錄│├─Models 模型目錄├─resources 資源目錄│├─views 視圖目錄├─public 公開目錄├─myframe 框架目錄├─vendor Composer依賴包目錄(由Composer自動(dòng)創(chuàng)建)8.1劃分框架目錄結(jié)構(gòu)使用Composer管理項(xiàng)目8.2
先定一個(gè)小目標(biāo)!掌握Composer的安裝,能夠獨(dú)立安裝Composer。8.2.1安裝ComposerComposer是PHP項(xiàng)目中管理項(xiàng)目依賴的工具,開發(fā)人員在項(xiàng)目中聲明依賴的外部工具庫(kù),Composer就會(huì)自動(dòng)安裝工具庫(kù)依賴的庫(kù)文件。大多數(shù)PHP框架都支持Composer。在Composer官方網(wǎng)站可以下載Composer。在Windows中安裝Composer的方式有兩種:使用安裝程序安裝使用命令行安裝8.2.1安裝Composer1在Composer官網(wǎng)下載Composer-Setup.exe,雙擊下載文件啟動(dòng)安裝程序,選擇推薦的安裝模式。安裝程序提示選擇是否使用開發(fā)者模式,若選中此項(xiàng)不提供卸載功能,推薦不選中。2安裝過程提示選擇PHP命令行程序時(shí),單擊“Browse…”按鈕瀏覽文件,選擇C:\web\php8.2\php.exe。38.2.1安裝Composer使用安裝程序安裝的步驟:4進(jìn)入填寫代理服務(wù)器界面,選擇不使用代理,單擊“Next”按鈕。進(jìn)入準(zhǔn)備安裝界面,單擊“Install”按鈕進(jìn)行安裝。5打開新的命令提示符窗口,執(zhí)行“composer”命令測(cè)試Composer是否安裝成功。68.2.1安裝Composer使用安裝程序安裝的步驟:
先定一個(gè)小目標(biāo)!掌握使用Composer實(shí)現(xiàn)自動(dòng)加載的方法,能夠在自定義框架中實(shí)現(xiàn)類的自動(dòng)加載。8.2.2使用Composer實(shí)現(xiàn)自動(dòng)加載雖然PHP提供了自動(dòng)加載機(jī)制,但是要在項(xiàng)目中實(shí)現(xiàn)自動(dòng)加載功能還需要手動(dòng)編寫代碼,操作起來相對(duì)復(fù)雜。為了使開發(fā)更簡(jiǎn)單,可以在myframe.test項(xiàng)目中使用Composer實(shí)現(xiàn)類的自動(dòng)加載。8.2.2使用Composer實(shí)現(xiàn)自動(dòng)加載1在C:\web\www\myframe目錄下創(chuàng)建composer.json文件,定義自動(dòng)加載的命名空間。在命令提示符窗口中切換到composer.json文件所在目錄,執(zhí)行composerinstall命令安裝依賴關(guān)系所需組件,初始化自動(dòng)加載信息。2重新編寫public\index.php文件,引入vendor\autoload.php文件實(shí)現(xiàn)自動(dòng)加載。3在myframe.test項(xiàng)目中使用Composer實(shí)現(xiàn)類的自動(dòng)加載具體步驟:8.2.2使用Composer實(shí)現(xiàn)自動(dòng)加載4將原有的app\StudentController.php放入app\Http\Controllers目錄。將原有的視圖文件views\student.php移動(dòng)到resources\views目錄中。修改public\index.php文件,定義路由規(guī)則,根據(jù)路由找到對(duì)應(yīng)的控制器名和方法名。56在myframe.test項(xiàng)目中使用Composer實(shí)現(xiàn)類的自動(dòng)加載具體步驟:將原有的app\StudentModel.php修改為app\Models\Student.php。修改Student.php,將命名空間放在App下。8.2.2使用Composer實(shí)現(xiàn)自動(dòng)加載
先定一個(gè)小目標(biāo)!掌握使用Composer管理項(xiàng)目依賴的方法,能夠使用Composer安裝和卸載依賴包。8.2.3使用Composer管理項(xiàng)目依賴8.2.3使用Composer管理項(xiàng)目依賴在以前開發(fā)中,如果項(xiàng)目中使用了某個(gè)類庫(kù),需要手動(dòng)下載這個(gè)類庫(kù)的文件,并在代碼中引入類庫(kù)后才能使用。這種方式不僅麻煩,而且當(dāng)類庫(kù)的版本更新后,還需要重新下載類庫(kù)。如果一個(gè)類庫(kù)又依賴于另一個(gè)類庫(kù),這種層疊的依賴關(guān)系會(huì)讓項(xiàng)目的維護(hù)變得復(fù)雜并且低效。為了解決手動(dòng)下載類庫(kù)這個(gè)問題,Composer提供了項(xiàng)目依賴管理功能,它可以自動(dòng)完成依賴包的下載和安裝,并通過命名空間自動(dòng)引入。8.2.3使用Composer管理項(xiàng)目依賴Composer通過packagist資源庫(kù)獲取依賴包。在packagist資源庫(kù)中,依賴包的命名方式為“用戶名/包名”。例如“naux/auto-correct”包能夠在中文和英文之間添加空格,并糾正專用名詞的大小寫。安裝依賴包的兩種方式使用composerrequire命令安裝在配置文件中添加依賴包在composer.json文件中添加包的相關(guān)信息,在命令提示符窗口中執(zhí)行composerinstall命令或執(zhí)行composerupdate命令8.2.3使用Composer管理項(xiàng)目依賴通常情況下,一個(gè)包會(huì)有多個(gè)版本,指定版本號(hào)的多種方式:名稱實(shí)例描述特定的版本3.1.33包的版本是3.1.33某個(gè)范圍的版本~1.0包的版本大于等于1.0且小于1.1^1.0包的版本大于等于1.0且小于2.0>=3.1包的版本大于等于3.1>=2.6,<3.0包的版本大于等于2.6且小于3.0>=2.6,<3.0|>=3.1包的版本大于等于2.6且小于3.0,或大于等于3.1通配符方式3.1.*與>=3.1,<3.2等價(jià)8.2.3使用Composer管理項(xiàng)目依賴以naux/auto-correct包為例,演示使用Composer管理項(xiàng)目依賴:1安裝依賴包需要開啟zip擴(kuò)展,在PHP配置文件php.ini開啟zip擴(kuò)展。在命令提示符窗口中切換到C:\web\www\myframe目錄,執(zhí)行composerrequire命令安裝依賴包。2在app\Http\Controllers\StudentController.php中導(dǎo)入命名空間,編寫test()方法。38.2.3使用Composer管理項(xiàng)目依賴test()方法的代碼:第1種方式publicfunctiontest(){$correct=newAutoCorrect;//在中文和英文之間添加空格
echo$correct->auto_space('《php網(wǎng)站開發(fā)實(shí)例教程》');//糾正專用詞匯的大小寫
echo$correct->auto_correct('《php網(wǎng)站開發(fā)實(shí)例教程》');}輸出結(jié)果:《php網(wǎng)站開發(fā)實(shí)例教程》《PHP網(wǎng)站開發(fā)實(shí)例教程》8.2.3使用Composer管理項(xiàng)目依賴如果想要卸載依賴包,可以使用如下命令:第1種方式composerremovenaux/auto-correct卸載依賴包會(huì)將依賴配置刪除,并刪除vendor目錄中依賴包的相關(guān)文件。8.2.3使用Composer管理項(xiàng)目依賴
先定一個(gè)小目標(biāo)!掌握使用Composer管理項(xiàng)目的方法,能夠創(chuàng)建自己的包。8.2.4【案例】創(chuàng)建自己的包在進(jìn)行項(xiàng)目開發(fā)時(shí),除了可以使用Composer下載packagist中的依賴包外,還可以將自己實(shí)現(xiàn)的功能或項(xiàng)目打包成依賴包,完成測(cè)試后,將其發(fā)布到Packagist資源庫(kù)中供其他人使用。下面通過案例演示如何使用Composer創(chuàng)建自己的包。
案例需求8.2.4【案例】創(chuàng)建自己的包①在C:\web\apache2.4\htdocs目錄中創(chuàng)建包的基礎(chǔ)目錄custom-php-json,在該目錄下創(chuàng)建src目錄和src\Json.php文件,實(shí)現(xiàn)對(duì)數(shù)據(jù)的JSON編碼和解碼。②創(chuàng)建custom-php-json\composer.json文件,編寫包的初始化信息。③在項(xiàng)目中使用創(chuàng)建的包,測(cè)試對(duì)數(shù)據(jù)的JSON編碼和解碼。
實(shí)現(xiàn)思路8.2.4【案例】創(chuàng)建自己的包框架基礎(chǔ)搭建8.3
先定一個(gè)小目標(biāo)!掌握框架基礎(chǔ)搭建,能夠?qū)崿F(xiàn)App類。8.3.1App類App類的代碼用于實(shí)現(xiàn)框架的啟動(dòng)。在前面的開發(fā)中,框架的啟動(dòng)是通過入口文件實(shí)現(xiàn)的,而將啟動(dòng)框架的核心代碼放在App類中,可以使代碼更加符合面向?qū)ο蟮乃枷搿?.3.1App類實(shí)現(xiàn)App類的具體步驟:1準(zhǔn)備工作在composer.json中添加命名空間配置,編寫run()方法實(shí)現(xiàn)應(yīng)用啟動(dòng),在index.php中實(shí)例化App類并調(diào)用run()方法。路由檢測(cè)根據(jù)用戶請(qǐng)求的URL,檢測(cè)對(duì)應(yīng)的控制器名和方法名。例如,用戶請(qǐng)求的URL:http://www.myframe.test/student/test,檢測(cè)結(jié)果為Student控制器test()方法。2請(qǐng)求分發(fā)在App類中,根據(jù)路由檢測(cè)的結(jié)果調(diào)用對(duì)應(yīng)控制器和方法,實(shí)現(xiàn)請(qǐng)求分發(fā)。38.3.1App類
先定一個(gè)小目標(biāo)!掌握框架基礎(chǔ)搭建,能夠?qū)崿F(xiàn)Request類。8.3.2Request類Request類負(fù)責(zé)獲取請(qǐng)求信息,它是對(duì)當(dāng)前請(qǐng)求的封裝。通過Request類可以獲取$_GET、$_POST、$_SERVER等超全局變量中的數(shù)據(jù)。與直接訪問超全局變量相比,使用Request類可以對(duì)所有的請(qǐng)求數(shù)據(jù)進(jìn)行統(tǒng)一處理,提供一種面向?qū)ο?、?jiǎn)單易用的操作方式。下面以獲取$_SERVER超全局變量的請(qǐng)求信息為例進(jìn)行講解。8.3.2Request類實(shí)現(xiàn)Request類的具體步驟:1創(chuàng)建myframe\Request.php文件編寫server()方法和pathinfo()方法,其中server()方法用于獲取$_SERVER中的數(shù)據(jù),pathinfo()方法用于解析PATH_INFO。在App類中使用Request類在App類中定義構(gòu)造方法實(shí)例化Request類,修改routeCheck()方法,調(diào)用Request類的pathinfo()方法獲取請(qǐng)求信息。28.3.2Request類
先定一個(gè)小目標(biāo)!掌握框架基礎(chǔ)搭建,能夠?qū)崿F(xiàn)Response類。8.3.3Response類Response類負(fù)責(zé)處理響應(yīng)信息。將響應(yīng)輸出的代碼封裝到Response類中,開發(fā)人員不再需要使用其他輸出語句輸出數(shù)據(jù),輸出數(shù)據(jù)的工作由Response類處理。下面講解如何實(shí)現(xiàn)Response類。8.3.3Response類實(shí)現(xiàn)Response類的具體步驟:1創(chuàng)建myframe\Response.php文件在類中定義$code、$header和$data屬性,分別表示響應(yīng)狀態(tài)碼、響應(yīng)頭和響應(yīng)數(shù)據(jù)。實(shí)現(xiàn)Response類編寫構(gòu)造方法,在創(chuàng)建對(duì)象時(shí)傳入基本參數(shù),編寫send()方法用于輸出數(shù)據(jù),編寫create()靜態(tài)方法用于創(chuàng)建本類對(duì)象。2使用Response類在App類的dispatch()方法中,接收控制器的返回結(jié)果并創(chuàng)建Response實(shí)例,在App類的run()方法中返回Response實(shí)例,在public\index.php中,修改啟動(dòng)應(yīng)用的代碼,調(diào)用send()方法將結(jié)果輸出。38.3.3Response類
先定一個(gè)小目標(biāo)!掌握框架基礎(chǔ)搭建,能夠?qū)崿F(xiàn)Container類。8.3.4Container類在框架中,有許多類只希望被實(shí)例化一次,例如,數(shù)據(jù)庫(kù)操作類。為了避免一個(gè)類被重復(fù)實(shí)例化,通常將這些類的對(duì)象放到容器中。Container類表示容器,它用于創(chuàng)建對(duì)象,并將創(chuàng)建的對(duì)象放在容器中,當(dāng)再次創(chuàng)建相同類的對(duì)象時(shí),如果容器中存在則直接返回,不必重復(fù)創(chuàng)建。下面講解如何實(shí)現(xiàn)Container類。8.3.4Container類實(shí)現(xiàn)Container類的具體步驟:1創(chuàng)建myframe\Container.php文件創(chuàng)建make()方法用于創(chuàng)建對(duì)象,將對(duì)象保存在數(shù)組中,定義靜態(tài)方法getInstance()創(chuàng)建自身對(duì)象,修改App類的構(gòu)造方法,通過Container::getInstance()創(chuàng)建容器對(duì)象。使用Container類修改App類繼承Container類,在構(gòu)造方法中創(chuàng)建Request對(duì)象。28.3.4Container類反射8.4
先定一個(gè)小目標(biāo)!掌握反射API的使用,能夠使用反射API實(shí)現(xiàn)反射。8.4.1反射API反射是PHP針對(duì)面向?qū)ο缶幊烫峁┑囊环N“自省”的過程。可以將其理解為根據(jù)“目的地”尋找“出發(fā)地或來源”。例如,對(duì)某個(gè)對(duì)象進(jìn)行反射,找到這個(gè)對(duì)象所屬的類、擁有的方法和屬性、方法的參數(shù)、文檔注釋等詳細(xì)信息。8.4.1反射API在PHP中使用反射,主要通過反射API來完成。反射API常用的類與接口:8.4.1反射API類/接口說明Reflection反射類Reflector反射接口ReflectionClass獲取類的相關(guān)信息ReflectionObject獲取對(duì)象的相關(guān)信息ReflectionMethod獲取方法的相關(guān)信息ReflectionProperty獲取類的屬性的相關(guān)信息ReflectionParameter獲取函數(shù)或方法參數(shù)的相關(guān)信息1/2在PHP中使用反射,主要通過反射API來完成。反射API常用的類與接口:8.4.1反射API類/接口實(shí)例ReflectionExtension獲取擴(kuò)展的相關(guān)信息ReflectionFunction獲取函數(shù)的相關(guān)信息ReflectionFunctionAbstractReflectionFunction的父類ReflectionException用于反射異常處理ReflectionClassConstant獲取類常量的信息ReflectionType獲取參數(shù)或者返回值的類型2/2ReflectionClass類常用的方法:8.4.1反射API類名方法名功能描述ReflectionClassgetMethod()獲取一個(gè)類方法的ReflectionMethod對(duì)象getName()獲取類名getConstructor()獲取類的構(gòu)造函數(shù)getProperties()獲取一組屬性hasMethod()檢查方法是否已定義hasProperty()檢查屬性是否已定義newInstance()通過指定的參數(shù)創(chuàng)建一個(gè)新的類實(shí)例newInstanceArgs()通過數(shù)組參數(shù)創(chuàng)建一個(gè)新的類實(shí)例ReflectionMethod類和ReflectionFunctionAbstract類常用的方法:8.4.1反射API類名方法名功能描述ReflectionMethodinvoke()實(shí)現(xiàn)執(zhí)行操作invokeArgs()帶參數(shù)執(zhí)行isPublic()判斷方法是不是公開方法ReflectionFunctionAbstractgetNumberOfParameters()獲取參數(shù)數(shù)目getParameters獲取參數(shù)ReflectionProperty類常用的方法:8.4.1反射API類名方法名功能描述ReflectionPropertygetDocComment()獲取屬性文檔注釋getName()獲取屬性名稱getValue()獲取屬性值isDefault()檢查屬性是不是默認(rèn)屬性isPrivate()檢查屬性是不是私有屬性isProtected()檢查屬性是不是保護(hù)屬性isPublic()檢查屬性是不是公有屬性isStatic()檢查屬性是不是靜態(tài)屬性ReflectionParameter類和ReflectionExtension類常用的方法:8.4.1反射API類名方法名功能描述ReflectionParametergetClass()獲得類型提示類getDefaultValue()獲取默認(rèn)屬性值ReflectionExtensiongetFunctions()獲取擴(kuò)展中的函數(shù)getINIEntries()獲取ini配置getVersion()獲取擴(kuò)展版本號(hào)info()輸出擴(kuò)展信息8.4.1反射API下面演示如何使用反射獲取類屬性的信息,具體步驟如下。<?php//定義一個(gè)類,用于測(cè)試classUpload{/***上傳文件信息*/private$file=[];/***上傳文件保存目錄*/public$upload_dir='/upload/';}8.4.1反射APISTEP01編寫Upload.php文件。該文件用于后續(xù)通過反射來獲取其基本信息。<?phprequire'./upload.php';//獲取類中所有的屬性$reflect=newReflectionClass('Upload');$properties=$reflect->getProperties();var_dump($properties);foreach($propertiesas$property){if($property->isPublic()){var_dump($property->getDocComment()); //文檔注釋
var_dump($property->getName()); //屬性名稱
var_dump($property->getValue(newUpload)); //屬性值
}}8.4.1反射APISTEP02創(chuàng)建reflect.php文件。引入U(xiǎn)pload.php,獲取Upload類的所有屬性,輸出其中的公有屬性。獲取Upload類的反射對(duì)象,通過反射對(duì)象調(diào)用getProperties()方法獲取Upload類的所有屬性8.4.1反射APISTEP03reflect.php文件的運(yùn)行結(jié)果。
先定一個(gè)小目標(biāo)!掌握依賴注入的使用,能夠利用反射實(shí)現(xiàn)依賴注入。8.4.2依賴注入依賴注入是許多框架都有的功能。依賴是指一個(gè)類依賴另一個(gè)類的對(duì)象,通過依賴注入可以將當(dāng)前類依賴的對(duì)象注入進(jìn)來以便使用。8.4.2依賴注入指框架通過類的構(gòu)造方法的參數(shù)為類注入依賴的對(duì)象8.4.2依賴注入依賴注入構(gòu)造方法的依賴注入普通方法的依賴注入指框架通過類的普通方法的參數(shù)為類注入依賴的對(duì)象下面演示使用依賴注入和不使用依賴注入的區(qū)別。8.4.2依賴注入8.4.2依賴注入不使用依賴注入publicfunction__construct(){$this->request=newRequest();}使用依賴注入publicfunction__construct(Request$request){$this->request=$request;}直接通過構(gòu)造方法的參數(shù)接收依賴的Request類的對(duì)象構(gòu)造方法中實(shí)例化Request類,Request類的對(duì)象會(huì)被重復(fù)創(chuàng)建。
先定一個(gè)小目標(biāo)!掌握反射的實(shí)現(xiàn),能夠在自定義框架中實(shí)現(xiàn)依賴注入。8.4.3【案例】利用反射實(shí)現(xiàn)依賴注入了解了反射API和依賴注入后,接下來在自定義框架中實(shí)現(xiàn)依賴注入。自定義框架需要借助反射API獲取構(gòu)造方法和普通方法依賴的對(duì)象,將依賴的對(duì)象創(chuàng)建后注入。
案例需求8.4.3【案例】利用反射實(shí)現(xiàn)依賴注入①實(shí)現(xiàn)構(gòu)造方法的依賴注入。修改myframe\Container.php的make()方法,創(chuàng)建對(duì)象前使用ReflectionClass類獲取構(gòu)造方法的參數(shù),根據(jù)參數(shù)獲取類名,實(shí)例化該構(gòu)造方法依賴的類并完成依賴注入。②實(shí)現(xiàn)普通方法的依賴注入。修改myframe\App.php的dispatch()方法,創(chuàng)建普通方法前使用ReflectionMethod類獲取普通方法依賴的對(duì)象,在調(diào)用普通方法時(shí)傳入依賴的對(duì)象,完成依賴注入。
實(shí)現(xiàn)思路8.4.3【案例】利用反射實(shí)現(xiàn)依賴注入異常處理8.5
先定一個(gè)小目標(biāo)!掌握異常的拋出和捕獲,能夠在程序中拋出和捕獲異常。8.5.1異常的拋出和捕獲PHP提供了Exception類表示程序中的異常,通過實(shí)例化該類可以創(chuàng)建異常對(duì)象,創(chuàng)建后的異常對(duì)象使用throw關(guān)鍵字拋出。語法格式$e=newException('異常信息');throw$e;可以簡(jiǎn)寫成:thrownewException('異常信息');8.5.1異常的拋出和捕獲使用try…catch語句可以捕獲程序中拋出的異常并進(jìn)行處理。語法格式try{//可能會(huì)拋出異常的代碼}catch(Exception$e){//進(jìn)行異常處理的代碼}catch塊后面還可以添加finally塊,無論程序是否發(fā)生異常,finally塊中的代碼都會(huì)執(zhí)行。如果不需要finally塊,可以將其省略。8.5.1異常的拋出和捕獲使用try…catch語句的注意事項(xiàng):每個(gè)try塊應(yīng)至少有一個(gè)對(duì)應(yīng)的catch塊或finally塊。catch塊可以有多個(gè),用于針對(duì)不同的異常類型進(jìn)行處理,捕獲到異常后執(zhí)行對(duì)應(yīng)的catch塊。發(fā)生異常時(shí),PHP會(huì)嘗試查找第一個(gè)匹配的catch塊來執(zhí)行,如果直到腳本結(jié)束時(shí)都沒有找到匹配的catch塊且無finally塊,將會(huì)出現(xiàn)Fatalerror錯(cuò)誤。8.5.1異常的拋出和捕獲<?phpfunctiondivision($num1,$num2) {if(!$num2){
thrownewException('除數(shù)不能為0'); //拋出異常
echo'拋出異常后,后面的代碼不執(zhí)行。'; //測(cè)試此行代碼是否會(huì)執(zhí)行
}return$num1/$num2;}STEP01創(chuàng)建exception01.php文件。8.5.1異常的拋出和捕獲try{echodivision(1,0); //調(diào)用函數(shù)
echo'當(dāng)上一行代碼拋出異常時(shí),后面的代碼不會(huì)執(zhí)行';}catch(Exception$e){ //Exception表示異常類,$e表示異常對(duì)象
echo$e->getMessage(); //獲取異常信息}finally{echo'<br>異常處理完成';}echo'<br>異常處理完成后,后面的代碼會(huì)繼續(xù)執(zhí)行';STEP02在try塊調(diào)用division()函數(shù)時(shí),第2個(gè)參數(shù)設(shè)為0,在catch塊輸出異常信息,在finally塊中換行輸出“異常處理完成”。8.5.1異常的拋出和捕獲STEP03exception01.php文件的運(yùn)行結(jié)果。8.5.1異常的拋出和捕獲
先定一個(gè)小目標(biāo)!掌握自定義異常類的實(shí)現(xiàn),能夠根據(jù)需求實(shí)現(xiàn)自定義異常類。8.5.2自定義異常類自定義異常類用于表示特定類型的異常。自定義的異常類需要繼承Exception類,在自定義異常類中可以根據(jù)需求完成異常處理。下面演示如何自定義異常類,具體步驟如下。8.5.2自定義異常類<?phpclassMyExceptionextendsException{protected$msg='自定義異常信息';publicfunctiongetCustomMessage(){return$this->getMessage()?:$this->msg;}}STEP01創(chuàng)建MyException.php文件。8.5.2自定義異常類<?phprequire'./MyException.php';$email='myframe.test';try{if(!filter_var($email,FILTER_VALIDATE_EMAIL)){thrownewMyException('E-mail地址不合法');}}catch(MyException$e){
echo$e->getCustomMessage(); //輸出結(jié)果:E-mail地址不合法}STEP02創(chuàng)建exception02.php文件。8.5.2自定義異常類
先定一個(gè)小目標(biāo)!掌握多異常捕獲處理,能夠在程序中實(shí)現(xiàn)多異常的捕獲處理。8.5.3多異常捕獲處理一個(gè)try塊除了對(duì)應(yīng)一個(gè)catch塊外,還可以對(duì)應(yīng)多個(gè)catch塊。在catch塊中使用throw關(guān)鍵字拋出異常時(shí),可以使用不同的異常類對(duì)象返回不同的描述信息。8.5.3多異常捕獲處理演示多異常的捕獲處理:8.5.3多異常捕獲處理require'./MyException.php';$email='tom@';try{if(!filter_var($email,FILTER_VALIDATE_EMAIL)){thrownewException('E-mail地址不合法');}elseif(substr($email,strrpos($email,'@')+1)===''){thrownewMyException('不能使用作為郵箱地址');}}catch(MyException$e){echo$e->getCustomMessage();//輸出結(jié)果:不能使用
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 月嫂知識(shí)培訓(xùn)課件模板
- 2024年普通高等學(xué)校招生全國(guó)統(tǒng)一考試模擬試題(一)英語試卷
- 2025年中國(guó)巧克力食品行業(yè)市場(chǎng)前景預(yù)測(cè)及投資戰(zhàn)略研究報(bào)告
- 2024中國(guó)橡膠靴鞋制造市場(chǎng)前景及投資研究報(bào)告
- 四川省成都市錦江區(qū)2023-2024學(xué)年九年級(jí)上學(xué)期期末化學(xué)試題
- 一年級(jí)數(shù)學(xué)計(jì)算題專項(xiàng)練習(xí)1000題集錦
- 胸部知識(shí)培訓(xùn)銷售課件
- 消防安全知識(shí)培訓(xùn)
- 藥品監(jiān)管知識(shí)培訓(xùn)課件
- 二零二五年度廢舊鋼板回收及再生利用合同3篇
- 2023醫(yī)院招聘護(hù)士考試真題庫(kù)及參考答案
- 湖北省襄樊市襄陽古城旅游區(qū)總體重點(diǎn)規(guī)劃
- 消火栓月檢查表
- 項(xiàng)目財(cái)務(wù)核算業(yè)務(wù)藍(lán)圖
- 8.臺(tái)球助教速成培訓(xùn)手冊(cè)0.9萬字
- 無縫鋼管焊接作業(yè)指導(dǎo)書(1)
- 零缺陷與質(zhì)量成本
- 網(wǎng)吧企業(yè)章程范本
- 安徽省書法家協(xié)會(huì)會(huì)員登記表
- 五格數(shù)理解釋及吉兇對(duì)照
- 婚姻狀況聲明書
評(píng)論
0/150
提交評(píng)論