




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第1章開(kāi)發(fā)環(huán)境搭建安裝VisualStudioCode搭建WAMP環(huán)境安裝Composer依賴管理工具Web服務(wù)器配置學(xué)習(xí)目標(biāo)熟悉VSCode編輯器的使用12掌握Apache、PHP和MySQL的安裝方法掌握Composer依賴管理工具的使用方法3熟悉掌握掌握掌握4掌握虛擬主機(jī)和訪問(wèn)權(quán)限的配置方法目錄?點(diǎn)擊查看本節(jié)相關(guān)知識(shí)點(diǎn)?點(diǎn)擊查看本節(jié)相關(guān)知識(shí)點(diǎn)搭建WAMP環(huán)境1.21.1安裝VisualStudioCode1.3安裝Composer依賴管理工具?點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu)?點(diǎn)擊查看本節(jié)相關(guān)知識(shí)點(diǎn)Web服務(wù)器配置1.4知識(shí)架構(gòu)1.2搭建WAMP環(huán)境1安裝Apache2安裝PHP3安裝MySQL知識(shí)架構(gòu)1.4Web服務(wù)器配置1配置虛擬主機(jī)2訪問(wèn)權(quán)限配置3案例【按要求配置虛擬主機(jī)】1.1安裝VisualStudioCode
安裝VisualStudioCodeVisualStudioCode(簡(jiǎn)稱VSCode)是微軟開(kāi)發(fā)的一款代碼編輯器,具有免費(fèi)、開(kāi)源、輕量級(jí)、高性能、跨平臺(tái)等特點(diǎn)。1.1安裝VisualStudioCode
安裝VisualStudioCode1.2搭建WAMP環(huán)境
安裝Apache創(chuàng)建安裝目錄獲取Apache安裝軟件配置和安裝啟動(dòng)Apache服務(wù)1.2搭建WAMP環(huán)境
安裝Apache創(chuàng)建目錄:在C盤(pán)根目錄下創(chuàng)建一個(gè)名為web文件夾,作為PHP開(kāi)發(fā)環(huán)境的安裝位置在web中創(chuàng)建apache2.4子文件夾,將Apache安裝到此文件夾中進(jìn)行管理1.2搭建WAMP環(huán)境
安裝Apache獲取Apache編譯軟件,以2.4.38為例:1.2搭建WAMP環(huán)境
安裝Apache修改conf\httpd.conf,配置安裝路徑:配置服務(wù)器域名,刪除“#”號(hào):DefineSRVROOT"c:/Apache24"ServerName:801.2搭建WAMP環(huán)境
安裝ApacheApache常用的配置:配置項(xiàng)說(shuō)明ServerRoot"${SRVROOT}"Apache服務(wù)器的根目錄,即安裝目錄Listen80服務(wù)器監(jiān)聽(tīng)的端口號(hào),例如80、8080LoadModule需要加載的模塊ServerAdminadmin@服務(wù)器管理員的郵箱地址ServerName:80服務(wù)器的域名DocumentRoot"${SRVROOT}/htdocs"網(wǎng)站根目錄ErrorLog"logs/error.log"用于記錄錯(cuò)誤日志1.2搭建WAMP環(huán)境
安裝Apachehttpd-kinstall-nApache2.4切換到Apache的bin目錄,輸入以下命令開(kāi)始安裝1.2搭建WAMP環(huán)境
安裝Apache啟動(dòng)Apache服務(wù)通過(guò)ApacheServiceMonitor控制Apache服務(wù)的啟動(dòng)、停止和重新啟動(dòng)1.2搭建WAMP環(huán)境
安裝ApacheApache啟動(dòng)成功后,訪問(wèn)“http://localhost”測(cè)試Apache服務(wù)1.2搭建WAMP環(huán)境
安裝PHP獲取PHP安裝軟件配置PHP測(cè)試PHP是否安裝成功1.2搭建WAMP環(huán)境
安裝PHP獲取PHP安裝軟件:1.2搭建WAMP環(huán)境
安裝PHP將php-7.2.15-Win32-VC15-x86.zip壓縮包解壓到C:\web\php7.2目錄中:1.2搭建WAMP環(huán)境
安裝PHP引入擴(kuò)展目錄:在php.ini中搜索文本extension_dir,刪除該行“;”注釋
將路徑修改為PHP擴(kuò)展文件保存的路徑配置PHP時(shí)區(qū):搜索文本“date.timezone”,設(shè)置為UTC或PRCextension_dir="c:/web/php7.2/ext"date.timezone=PRC1.2搭建WAMP環(huán)境
安裝PHP在Apache中引入PHP模塊:在Apache配置文件httpd.conf第185行將PHP中的Apache2.4模塊引入LoadModulephp7_module"C:/web/php7.2/php7apache2_4.dll"<FilesMatch"\.php$">setHandlerapplication/x-httpd-php</FilesMatch>PHPIniDir"C:/web/php7.2"LoadFile"C:/web/php7.2/libssh2.dll"1.2搭建WAMP環(huán)境
安裝PHP配置Apache索引頁(yè):在httpd.conf中搜索DirectoryIndex,將index.php添加為默認(rèn)索引頁(yè)<IfModuledir_module>DirectoryIndexindex.htmlindex.php</IfModule>1.2搭建WAMP環(huán)境
安裝PHP測(cè)試PHP是否安裝成功:創(chuàng)建test.php并訪問(wèn)查看輸出結(jié)果<?phpphpinfo();?>1.2搭建WAMP環(huán)境
安裝MySQL獲取MySQL安裝軟件安裝MySQL登錄MySQL數(shù)據(jù)庫(kù)1.2搭建WAMP環(huán)境
安裝MySQL獲取MySQL安裝軟件:1.2搭建WAMP環(huán)境
安裝MySQL將壓縮包mysql-5.7.24-win32.zip解壓保存到C:\web\mysql5.7目錄中:1.2搭建WAMP環(huán)境
安裝MySQL運(yùn)行命令行工具,切換到MySQL的安裝目錄下開(kāi)始安裝MySQL:mysqld-installmysql5.71.2搭建WAMP環(huán)境
安裝MySQL創(chuàng)建配置文件C:\web\mysql5.7\my.ini,配置文件指定MySQL安裝目錄(basedir)、數(shù)據(jù)庫(kù)文件保存目錄(datadir)和端口號(hào)(port)[mysqld]basedir=C:/web/mysql5.7datadir=C:/web/mysql5.7/dataport=33061.2搭建WAMP環(huán)境
安裝MySQL初始化MySQL:mysqld--initialize-insecure1.2搭建WAMP環(huán)境
安裝MySQL啟動(dòng)或停止mysql服務(wù)的命令:netstartmysql5.7netstopmysql5.71.2搭建WAMP環(huán)境登錄MySQL服務(wù)器如果需要退出MySQL,直接使用exit或quit命令退出登錄
安裝MySQLmysql-uroot1.2搭建WAMP環(huán)境為了保護(hù)數(shù)據(jù)庫(kù)的安全,給root用戶設(shè)置密碼使用設(shè)置的密碼登錄
安裝MySQLmysql>ALTER
USER
'root'@'localhost'
IDENTIFIED
BY
'123456';mysql-uroot-p1234561.2搭建WAMP環(huán)境查看數(shù)據(jù)庫(kù):
安裝MySQL1.3安裝Composer管理工具
安裝ComposerComposer的安裝界面:1.3安裝Composer管理工具
安裝Composer根據(jù)安裝向?qū)О惭b,如果看到如下輸出結(jié)果則安裝成功______/____/_______________________________///__\/__`__\/__\/__\/___/_\/___///___//_////////_///_/(__)__//\____/\____/_//_//_/.___/\____/____/\___/_//_/Composerversion1.8.42019-02-1110:52:10……(由于輸出結(jié)果很長(zhǎng),此處省略)1.4Web服務(wù)器配置
配置虛擬主機(jī)在hosts文件中配置IP地址和域名的映射關(guān)系:www.php.testwww.admin.test1.4Web服務(wù)器配置
配置虛擬主機(jī)修改httpd.conf文件,啟用虛擬主機(jī)配置文件,去掉“#”號(hào):#Includeconf/extra/httpd-vhosts.conf1.4Web服務(wù)器配置
配置虛擬主機(jī)在httpd-vhosts.conf虛擬主機(jī)配置文件,添加虛擬主機(jī)的配置<VirtualHost*:80>DocumentRoot"c:/web/apache2.4/htdocs"ServerNamelocalhost</VirtualHost><VirtualHost*:80>DocumentRoot"C:/web/apache2.4/htdocs/www.php.test"ServerNamewww.php.test</VirtualHost>1.4Web服務(wù)器配置
配置虛擬主機(jī)啟動(dòng)在htdocs目錄中創(chuàng)建www.php.test目錄創(chuàng)建index.html內(nèi)容為“Welcomewww.php.test”訪問(wèn)兩個(gè)虛擬主機(jī)1.4Web服務(wù)器配置
訪問(wèn)權(quán)限控制<Directory/>AllowOverridenoneRequirealldenied</Directory>阻止所有訪問(wèn)1.4Web服務(wù)器配置
訪問(wèn)權(quán)限控制<Directory"${SRVROOT}/htdocs">OptionsIndexesFollowSymLinksAllowOverrideNoneRequireallgranted</Directory>不讀取分布式文件允許所有的訪問(wèn)啟用Apache的目錄瀏覽功能1.4Web服務(wù)器配置【案例】按照要求配置虛擬主機(jī)配置一個(gè)域名為www.admin.test的虛擬主機(jī)目錄指定為C:/web/www/www.admin.test關(guān)閉目錄瀏覽功能開(kāi)啟分布式配置文件只允許本地訪問(wèn)1.4Web服務(wù)器配置【案例】按照要求配置虛擬主機(jī)<VirtualHost*:80>DocumentRoot"C:/web/www/www.admin.test"ServerNamewww.admin.test</VirtualHost><Directory"C:/web/www"> Options-indexes AllowOverrideAll Requirelocal</Directory>第2章PHP框架基礎(chǔ)(上)初識(shí)框架MVC設(shè)計(jì)模式框架的單一入口和路由命名空間自動(dòng)加載代碼規(guī)范學(xué)習(xí)目標(biāo)熟悉框架在發(fā)開(kāi)中的作用12掌握MVC設(shè)計(jì)模式的基本思想掌握PHP命名空間和自動(dòng)加載的使用3熟悉掌握掌握掌握4掌握框架中路由的實(shí)現(xiàn)目錄?點(diǎn)擊查看本節(jié)相關(guān)知識(shí)點(diǎn)?點(diǎn)擊查看本節(jié)相關(guān)知識(shí)點(diǎn)MVC設(shè)計(jì)模式2.22.1初識(shí)框架2.3框架的單一入口和路由?點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu)目錄?點(diǎn)擊查看本節(jié)相關(guān)知識(shí)點(diǎn)?點(diǎn)擊查看本節(jié)相關(guān)知識(shí)點(diǎn)自動(dòng)加載2.52.4命名空間2.6代碼規(guī)范?點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu)知識(shí)架構(gòu)2.1初識(shí)框架1什么是框架2常見(jiàn)的PHP框架知識(shí)架構(gòu)2.2MVC設(shè)計(jì)模式1什么是MVC2案例【體驗(yàn)MVC設(shè)計(jì)模式】知識(shí)架構(gòu)2.3框架的單一入口和路由1什么是單一入口2案例【單一入口的實(shí)現(xiàn)】3案例【隱藏入口文件】4框架中的路由5案例【路由代碼的實(shí)現(xiàn)】知識(shí)架構(gòu)2.4命名空間1命名空間的定義2命名空間的使用3導(dǎo)入命名空間知識(shí)架構(gòu)2.5自動(dòng)加載1注冊(cè)自動(dòng)加載函數(shù)2注冊(cè)多個(gè)自動(dòng)加載函數(shù)3注冊(cè)自動(dòng)加載方法知識(shí)架構(gòu)2.6代碼規(guī)范1PSR規(guī)范2配置VCCode編輯器2.1初識(shí)框架
什么是框架遵循通用代碼規(guī)范,采用指定設(shè)計(jì)模式編寫(xiě)的代碼文件集合,這些代碼文件是程序結(jié)構(gòu)代碼,可在框架中實(shí)現(xiàn)業(yè)務(wù)功能2.1初識(shí)框架
常見(jiàn)的PHP框架Laravel:采用MVC架構(gòu)模式,支持Composer,提倡代碼的重用,保證代碼的簡(jiǎn)潔性與優(yōu)雅性,適合應(yīng)用各種開(kāi)發(fā)模式Y(jié)ii:實(shí)現(xiàn)了MVC設(shè)計(jì)模式并基于該模式組織代碼。代碼簡(jiǎn)潔優(yōu)雅,將代碼的重用性發(fā)揮到了極致。適用于開(kāi)發(fā)大型Web應(yīng)用2.1初識(shí)框架
常見(jiàn)的PHP框架Symfony:
因穩(wěn)定性、長(zhǎng)久性、靈活性、可復(fù)用組件、速度快、性能高等特點(diǎn)備受關(guān)注,適用于建立企業(yè)級(jí)的完善應(yīng)用程序ThinkPHP:
代碼風(fēng)格符合PSR規(guī)范并支持Composer,方便項(xiàng)目移植和維護(hù),適用于Web應(yīng)用敏捷開(kāi)發(fā)和企業(yè)級(jí)應(yīng)用開(kāi)發(fā)2.2MVC設(shè)計(jì)模式
什么是MVCMVC是模型(Model)、視圖(View)和控制器(Controller)的英文首字母縮寫(xiě)模型用于處理數(shù)據(jù)的部分視圖指顯示在瀏覽器中的網(wǎng)頁(yè)控制器用來(lái)處理用戶交互的程序2.2MVC開(kāi)發(fā)模式應(yīng)用場(chǎng)景:用戶提交表單,控制器負(fù)責(zé)讀取用戶提交的數(shù)據(jù)進(jìn)行處理,向模型發(fā)送數(shù)據(jù),再通過(guò)視圖將處理結(jié)果顯示給用戶
什么是MVC2.2MVC開(kāi)發(fā)模式
什么是MVC2.2MVC開(kāi)發(fā)模式
【案例】體驗(yàn)MVC設(shè)計(jì)模式創(chuàng)建實(shí)現(xiàn)思路:創(chuàng)建www.myframe.test的虛擬機(jī)創(chuàng)建控制器,用來(lái)調(diào)用模型和視圖創(chuàng)建模型,讀取數(shù)據(jù)表中的數(shù)據(jù)創(chuàng)建視圖,將讀取的數(shù)據(jù)在視圖中展示2.3框架的單一入口和路由
什么是單一入口單一入口是指項(xiàng)目具有統(tǒng)一的入口文件,項(xiàng)目中的所有功能和操作都經(jīng)過(guò)入口文件,入口文件會(huì)完成許多統(tǒng)一處理的操作,如權(quán)限控制、用戶登錄驗(yàn)證等2.3框架的單一入口和路由
【案例】單一入口的實(shí)現(xiàn)利用Apache的PATH_INFO功能,為單一入口index.php傳遞參數(shù)根據(jù)參數(shù)查找對(duì)應(yīng)的控制器和方法:$pathinfo=isset($_SERVER['PATH_INFO'])?$_SERVER['PATH_INFO']:'';$arr=explode('/',trim($pathinfo,'/'));if(!isset($arr[1])){exit('請(qǐng)求信息有誤。');}list($controller,$action)=$arr;define('APP_PATH','../app/');define('VIEW_PATH','../views/');$controller=ucwords($controller).'Controller';requireAPP_PATH.$controller.'.php';$obj=new$controller();$obj->$action();實(shí)例化控制器調(diào)用方法2.3框架的單一入口和路由
【案例】隱藏入口文件利用Apache的URL重寫(xiě)功能,隱藏URL中的“/index.php”開(kāi)啟重寫(xiě)編寫(xiě)重寫(xiě)配置文件<IfModulemod_rewrite.c>Options+FollowSymlinks-MultiviewsRewriteEngineOnRewriteCond%{REQUEST_FILENAME}!-dRewriteCond%{REQUEST_FILENAME}!-fRewriteRule^(.*)$index.php/$1[QSA,PT,L]</IfModule>2.3框架的單一入口和路由
框架中的路由框架中的路由,可以簡(jiǎn)單理解為URL到具體的控制器和方法的映射為項(xiàng)目設(shè)計(jì)一套固定的URL訪問(wèn)方式,使項(xiàng)目的URL具有獨(dú)立性2.3框架的單一入口和路由
【案例】路由的代碼實(shí)現(xiàn)實(shí)現(xiàn)當(dāng)訪問(wèn)http://myframe.test/student時(shí)映射到student控制器的index()方法在public\index.php文件,定義路由規(guī)則:$route=['student'=>'student/index'];$pathinfo=trim($pathinfo,'/');if(isset($route[$pathinfo])){$pathinfo=$route[$pathinfo];}2.4命名空間命名空間遵循基本標(biāo)識(shí)符命名規(guī)則,以數(shù)字、字母和下劃線構(gòu)成,不能以數(shù)字開(kāi)頭命名空間必須是程序腳本的第1條語(yǔ)句,如果在PHP開(kāi)始標(biāo)記前有空格都會(huì)報(bào)“Fatalerror”錯(cuò)誤提示namespace空間名稱;
命名空間的定義2.4命名空間
命名空間的使用思考:創(chuàng)建兩個(gè)PHP文件分別定義不同的命名空間,one命名空間中定義變量和常量,two命名空間直接輸出one命名空間的變量和常量,試想程序輸出結(jié)果2.4命名空間
導(dǎo)入命名空間當(dāng)在一個(gè)命名空間中使用其他命名空間中的類(lèi)和接口時(shí),通過(guò)use關(guān)鍵字導(dǎo)入指定的空間,也可以對(duì)導(dǎo)入的內(nèi)容使用as關(guān)鍵字設(shè)置別名2.4命名空間從PHP5.6開(kāi)始,還允許導(dǎo)入函數(shù)和常量,并可為其設(shè)置別名useconst常量名;//導(dǎo)入常量usefunction函數(shù)名;//導(dǎo)入函數(shù)
導(dǎo)入命名空間2.5自動(dòng)加載第1個(gè)參數(shù)表示待注冊(cè)的自動(dòng)加載函數(shù)第2個(gè)參數(shù)用于設(shè)置自動(dòng)加載函數(shù)注冊(cè)失敗時(shí)是否拋出異常第3個(gè)參數(shù)設(shè)置注冊(cè)的自動(dòng)加載函數(shù)添加到隊(duì)列的開(kāi)頭或結(jié)尾語(yǔ)法格式:bool
spl_autoload_register
([
callable
$autoload_function
[,
bool
$throw
=
TRUE
[,
bool$prepend
=
FALSE
]]])
注冊(cè)自動(dòng)加載函數(shù)2.5自動(dòng)加載注冊(cè)自動(dòng)加載函數(shù)案例演示spl_autoload_register()函數(shù)的使用functionloader($classname){$filename=substr($classname,strrpos($classname,'\\')+1);$filename=$filename.'.php';if(is_file($filename)){require$filename;}}spl_autoload_register('loader');//自動(dòng)加載2.4.3節(jié)創(chuàng)建的Container類(lèi),調(diào)用student()靜態(tài)方法echoContainer::student();
2.5自動(dòng)加載注冊(cè)多個(gè)自動(dòng)加載函數(shù)案例演示spl_autoload_register()函數(shù)注冊(cè)多個(gè)自動(dòng)加載函數(shù)<?phpspl_autoload_register(function($classname){echo'第1個(gè)自動(dòng)加載函數(shù)','<br>';});spl_autoload_register(function($classname){echo'第2個(gè)自動(dòng)加載函數(shù)','<br>';});$obj=newTest();2.5自動(dòng)加載注冊(cè)自動(dòng)加載方法PHP中還可以將指定的方法注冊(cè)為自動(dòng)加載方法語(yǔ)法格式://注冊(cè)靜態(tài)方法,有以下兩種方式spl_autoload_register(['類(lèi)名','方法名'])spl_autoload_register('類(lèi)名::方法名')//注冊(cè)非靜態(tài)方法,只有一種方式spl_autoload_register([對(duì)象,'方法名'])2.5自動(dòng)加載注冊(cè)自動(dòng)加載方法//注冊(cè)靜態(tài)方法spl_autoload_register(['Auto','load01']);spl_autoload_register('Auto::load01');//注冊(cè)非靜態(tài)方法$auto=newAuto();spl_autoload_register([$auto,'load02']);classAuto{publicstaticfunctionload01($classname){/*處理自動(dòng)加載的代碼*/}publicfunctionload02($classname){/*處理自動(dòng)加載的代碼*/}}2.6代碼規(guī)范
PSR規(guī)范PHP開(kāi)源框架的開(kāi)發(fā)者于2009年成立了PHP-FIG(PHP框架互用性小組)用于制定PHP代碼的編寫(xiě)規(guī)范PSR(PHP推薦標(biāo)準(zhǔn))是PHPFIG組織制定的PHP代碼開(kāi)發(fā)規(guī)范使PHP框架遵循統(tǒng)一的編碼規(guī)范,避免各家自行發(fā)展的風(fēng)格阻礙PHP的發(fā)展2.6代碼規(guī)范
PSR規(guī)范編號(hào)名稱編號(hào)名稱PSR-1基礎(chǔ)編碼規(guī)范PSR-11容器接口PSR-2編碼風(fēng)格規(guī)范PSR-13超媒體鏈接PSR-3日志接口規(guī)范PSR-15HTTP請(qǐng)求處理器PSR-4自動(dòng)加載優(yōu)化規(guī)范PSR-16SimpleCachePSR-6緩存接口規(guī)范PSR-17HTTPFactoriesPSR-7HTTP消息接口規(guī)范PSR-18HTTPClient目前正在使用的PSR標(biāo)準(zhǔn):2.6代碼規(guī)范
PSR規(guī)范PSR標(biāo)準(zhǔn)名稱說(shuō)明PSR-1PHP腳本的編碼必須以不帶BOM的UTF-8編碼PHP腳本的開(kāi)始標(biāo)簽必須以<?php或<?=標(biāo)簽開(kāi)始類(lèi)名必須遵循大寫(xiě)開(kāi)頭的駝峰命名規(guī)范類(lèi)常量名稱必須全部大寫(xiě),多個(gè)單詞用下劃線分隔方法名必須符合小寫(xiě)開(kāi)頭的駝峰命名規(guī)范PSR-2代碼縮進(jìn)必須使用4個(gè)空格符,不能使用【Tab】縮進(jìn)namespace或use關(guān)鍵字namespace或use聲明后必須插入一個(gè)空白行類(lèi)與方法體開(kāi)始“{”與結(jié)束“}”必須自成一行類(lèi)的屬性和方法必須添加訪問(wèn)修飾符PSR-1、PSR-2、PSR-4的部分規(guī)范要求:2.6代碼規(guī)范
PSR規(guī)范PSR-1、PSR-2、PSR-4的部分規(guī)范要求:PSR標(biāo)準(zhǔn)名稱說(shuō)明PSR-2靜態(tài)方法static必須聲明在訪問(wèn)修飾符之后PHP腳本的結(jié)束標(biāo)簽純PHP腳本必須省略結(jié)束標(biāo)簽?>PHP腳本必須以一個(gè)空白行作為結(jié)束true、false和null必須使用小寫(xiě)繼承與實(shí)現(xiàn)接口extends和implements必須寫(xiě)在類(lèi)名稱的同一行PSR-4命名空間與目錄每個(gè)命名空間必須有對(duì)應(yīng)的同名目錄,并且必須區(qū)分大小寫(xiě)文件名與類(lèi)名一個(gè)文件應(yīng)該有一個(gè)類(lèi),且文件名必須與類(lèi)名相同2.6代碼規(guī)范
配置VSCode編輯器PHPIntelliSense擴(kuò)展:PHP代碼自動(dòng)補(bǔ)全函數(shù)參數(shù)提示查找引用查看定義2.6代碼規(guī)范phpcs擴(kuò)展:composerglobalrequiresquizlabs/php_codesniffer打開(kāi)php文件進(jìn)行測(cè)試,如果語(yǔ)法不規(guī)范,編輯器會(huì)進(jìn)行提示
當(dāng)有不規(guī)范的代碼時(shí),使用phpcsfixer自動(dòng)修正。使用Alt+Shift+F快捷鍵修復(fù)
配置VSCode編輯器2.6代碼規(guī)范EditorConfigforVSCode:配置項(xiàng)目的代碼風(fēng)格,創(chuàng)建.editorconfig將php文件的縮進(jìn)設(shè)為4個(gè)空格,將html和js文件的縮進(jìn)設(shè)為2個(gè)空格[*.php]indent_style=spaceindent_size=4[*.html]indent_style=spaceindent_size=2[*.js]indent_style=spaceindent_size=2
配置VSCode編輯器第3章PHP框架基礎(chǔ)(下)創(chuàng)建自定義框架框架基礎(chǔ)搭建反射異常處理學(xué)習(xí)目標(biāo)熟悉框架底層代碼的實(shí)現(xiàn)12掌握框架中對(duì)自動(dòng)加載和請(qǐng)求的處理方法掌握PHP的異常處理方法3熟悉掌握掌握掌握4掌握PHP中反射的使用目錄?點(diǎn)擊查看本節(jié)相關(guān)知識(shí)點(diǎn)?點(diǎn)擊查看本節(jié)相關(guān)知識(shí)點(diǎn)框架基礎(chǔ)搭建3.23.1創(chuàng)建自定義框架3.3反射?點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu)?點(diǎn)擊查看本節(jié)相關(guān)知識(shí)點(diǎn)異常處理3.4知識(shí)架構(gòu)3.1創(chuàng)建自定義框架1創(chuàng)建目錄結(jié)構(gòu)2使用Composer實(shí)現(xiàn)自動(dòng)加載3使用Composer管理項(xiàng)目依賴4【案例】創(chuàng)建自己的包知識(shí)架構(gòu)3.2框架基礎(chǔ)搭建1App類(lèi)2Request類(lèi)3Response類(lèi)4Container類(lèi)知識(shí)架構(gòu)3.3反射1反射API2案例【利用反射實(shí)現(xiàn)依賴注入】知識(shí)架構(gòu)3.4異常處理1異常的拋出和捕獲2自定義異常3多異常捕獲處理4【案例】在框架中處理異常3.1創(chuàng)建自定義框架
創(chuàng)建目錄結(jié)構(gòu)├─app 應(yīng)用目錄│├─HttpHTTP請(qǐng)求目錄││├─Controllers 控制器目錄├─resources 資源目錄│├─views視圖文件目錄├─public 公開(kāi)目錄├─myframe 框架目錄├─vendorComposer依賴包目錄3.1創(chuàng)建自定義框架
使用Composer實(shí)現(xiàn)自動(dòng)加載利用Composer提供的功能實(shí)現(xiàn)類(lèi)的自動(dòng)加載,創(chuàng)建composer.json文件{"autoload":{"psr-4":{“App\\":"app/"}}}3.1創(chuàng)建自定義框架創(chuàng)建執(zhí)行composerinstall命令安裝依賴關(guān)系所需組件安裝成功后會(huì)在當(dāng)前目錄下生成一個(gè)vendor目錄
使用Composer實(shí)現(xiàn)自動(dòng)加載3.1創(chuàng)建自定義框架引入自動(dòng)加載文件vendor/autoload.php在控制器和模型定義命名空間,使用use關(guān)鍵字導(dǎo)入命名空間測(cè)試自動(dòng)加載功能是否已經(jīng)實(shí)現(xiàn)
使用Composer實(shí)現(xiàn)自動(dòng)加載3.1創(chuàng)建自定義框架創(chuàng)建Composer可以自動(dòng)完成各種依賴包的下載和安裝以fengqi/hanzi為例進(jìn)行演示
使用Composer管理項(xiàng)目依賴composerrequirefengqi/hanzi=0.1.23.1創(chuàng)建自定義框架依賴包的版本號(hào):
使用Composer管理項(xiàng)目依賴名稱實(shí)例描述特定的版本3.1.33指定包的版本是是3.1.33某個(gè)范圍的版本>=3.1>=2.6,<3.0>=2.6,<3.0|>=3.1包的版本大于等于3.1包的版本大于等于2.6,且小于3.0包的版本大于等于2.6,且小于3.0;或包的版本大于等于3.1通配符方式3.1.*與>=3.1,<3.2表達(dá)的含義等價(jià)3.1創(chuàng)建自定義框架使用依賴包,將Hanzi類(lèi)導(dǎo)入后,編寫(xiě)test()方法,測(cè)試Hanzi類(lèi)usefengqi\Hanzi\Hanzi;publicfunctiontest(){$str='測(cè)試';print_r(Hanzi::pinyin($str));echo'<br>';echoHanzi::turn($str);}
使用Composer管理項(xiàng)目依賴array([py]=>cs[pinyin]=>ceshi)測(cè)試3.1創(chuàng)建自定義框架使用Composer創(chuàng)建自己的包,用于實(shí)現(xiàn)對(duì)數(shù)據(jù)JSON編碼和解碼的操作<?phpnamespaceCustomPHPJson;classJson{publicstaticfunctionencode($data){returnjson_encode($data);}publicstaticfunctiondecode($jsonData){returnjson_decode($jsonData,true);}}【案例】創(chuàng)建自己的包3.1創(chuàng)建自定義框架創(chuàng)建composer.json文件,編寫(xiě)包的初始信息{"name":"custom-php-json/custom-php-json","description":"PHPlibrarytoencodeanddecodeJSON","license":"MITLicense","authors":[{"name":"myname","email":"myname@mytp.test"}],"minimum-stability":"stable",
……}【案例】創(chuàng)建自己的包3.1創(chuàng)建自定義框架在本地環(huán)境中測(cè)試,在項(xiàng)目目錄中安裝依賴關(guān)系所需組件,初始化自動(dòng)加載信息C:\web\apache2.4\htdocs>cdcustom-php-jsonC:\web\apache2.4\htdocs\custom-php-json>composerinstallLoadingcomposerrepositorieswithpackageinformationUpdatingdependencies(includingrequire-dev)NothingtoinstallorupdateGeneratingautoloadfiles【案例】創(chuàng)建自己的包3.1創(chuàng)建自定義框架創(chuàng)建測(cè)試文件<?phprequire'./vendor/autoload.php';$data=[[1,'Tom'],[2,'Lucy']];var_dump(CustomPHPJson\Json::encode($data));//輸出結(jié)果:string(22)"[[1,"Tom"],[2,"Lucy"]]"【案例】創(chuàng)建自己的包3.2框架基礎(chǔ)搭建
App類(lèi)App類(lèi)的含義是應(yīng)用,它主要負(fù)責(zé)應(yīng)用啟動(dòng),App類(lèi)需要完成的工作:創(chuàng)建App類(lèi)路由檢測(cè)請(qǐng)求分發(fā)3.2框架基礎(chǔ)搭建
App類(lèi)路由檢測(cè):$path=isset($_SERVER['PATH_INFO'])?$_SERVER['PATH_INFO']:'';$path=trim($path,'/');$controller=dirname($path);$action=basename($path);$arr=explode('/',ucwords($controller,'/'));$controller=implode('\\',$arr).'Controller';$arr[]=$action;foreach($arras$v){if(!preg_match('/^[A-Za-z]\w{0,20}$/',$v)){exit('請(qǐng)求參數(shù)包含特殊字符!');}}return[$controller,$action];3.2框架基礎(chǔ)搭建
App類(lèi)請(qǐng)求分發(fā):list($controller,
$action)
=
$dispatch;$instance
=
$this->controller($controller);$instance->$action();創(chuàng)建控制器的實(shí)例使用控制器實(shí)例調(diào)用方法3.2框架基礎(chǔ)搭建
Request類(lèi)Request類(lèi)負(fù)責(zé)獲取$_GET、$_POST、$_SERVER等超全局變量中的數(shù)據(jù)創(chuàng)建Request類(lèi)編寫(xiě)方法分別獲取$_GET、$_POST、$_SERVER中的數(shù)據(jù)在其他類(lèi)中使用Request類(lèi)3.2框架基礎(chǔ)搭建
Response類(lèi)Response類(lèi)負(fù)責(zé)響應(yīng)信息,將所有響應(yīng)輸出的代碼全部封裝起來(lái)創(chuàng)建Request類(lèi),定義響應(yīng)狀態(tài)碼、響應(yīng)頭和數(shù)據(jù)屬性編寫(xiě)輸出數(shù)據(jù)和創(chuàng)建本類(lèi)對(duì)象的方法在其他類(lèi)中使用Response類(lèi)輸出內(nèi)容3.2框架基礎(chǔ)搭建
Container類(lèi)Container類(lèi)表示容器,用來(lái)創(chuàng)建對(duì)象當(dāng)創(chuàng)建相同類(lèi)的對(duì)象的時(shí)候,如果容器中存在,則直接返回,不會(huì)重復(fù)創(chuàng)建創(chuàng)建Container類(lèi)編寫(xiě)方法用來(lái)創(chuàng)建實(shí)例對(duì)象在其他類(lèi)中使用Container類(lèi)實(shí)例化類(lèi)3.3反射
反射API創(chuàng)建反射API提供的相關(guān)類(lèi)與接口:類(lèi)/接口說(shuō)明備注Reflection反射類(lèi)其參數(shù)是Reflector接口Reflector定義的反射接口被所有可導(dǎo)出的反射類(lèi)實(shí)現(xiàn)ReflectionClass獲取一個(gè)類(lèi)的有關(guān)信息實(shí)現(xiàn)Reflector接口ReflectionObject獲取一個(gè)對(duì)象相關(guān)信息繼承自ReflectionClass類(lèi)ReflectionMethod獲取一個(gè)方法有關(guān)信息繼承ReflectionFunctionAbstractReflectionProperty獲取類(lèi)的屬性相關(guān)信息實(shí)現(xiàn)Reflector接口ReflectionParameter獲取函數(shù)或方法參數(shù)的相關(guān)信息實(shí)現(xiàn)Reflector接口ReflectionExtension獲取一個(gè)擴(kuò)展有關(guān)信息實(shí)現(xiàn)Reflector接口ReflectionFunction獲取一個(gè)函數(shù)有關(guān)信息繼承自ReflectionFunctionAbstractReflectionFunctionAbstractReflectionFunction父類(lèi)實(shí)現(xiàn)Reflector接口ReflectionException用于反射異常處理實(shí)現(xiàn)Reflector接口ReflectionClassConstant獲取類(lèi)常量的信息實(shí)現(xiàn)Reflector接口ReflectionType獲取參數(shù)或返回值類(lèi)型反射相關(guān)類(lèi)方法返回值類(lèi)型3.3反射
反射API反射API提供的常用的方法:類(lèi)名方法名
功能描述ReflectionClassgetMethod()獲取一個(gè)類(lèi)方法的ReflectionMethod對(duì)象getName()獲取類(lèi)名getConstructor()獲取類(lèi)的構(gòu)造函數(shù)getProperties()獲取一組屬性hasMethod()檢查方法是否已定義hasProperty()檢查屬性是否已定義newInstance()通過(guò)指定的參數(shù)創(chuàng)建一個(gè)新的類(lèi)實(shí)例newInstanceArgs()通過(guò)數(shù)組參數(shù)創(chuàng)建一個(gè)新的類(lèi)實(shí)例ReflectionMethodinvoke()實(shí)現(xiàn)執(zhí)行操作invokeArgs()帶參數(shù)執(zhí)行isPublic()判斷方法是否是公開(kāi)方法ReflectionFunctionAbstractgetNumberOfParameters()獲取參數(shù)數(shù)目getParameters獲取參數(shù)3.3反射
反射API類(lèi)名方法名
功能描述ReflectionPropertygetDocComment()獲取屬性文檔注釋getName()獲取屬性名稱getValue()獲取屬性值isDefault()檢查屬性是否為默認(rèn)屬性isPrivate()檢查屬性是否是私有屬性isProtected()檢查屬性是否是保護(hù)屬性isPublic()檢查屬性是否是公有屬性isStatic()檢查屬性是否是靜態(tài)屬性ReflectionParametergetClass()獲得類(lèi)型提示類(lèi)getDefaultValue()獲取默認(rèn)屬性值ReflectionExtensiongetFunctions()獲取擴(kuò)展中的函數(shù)getINIEntries()獲取ini配置getVersion()獲取擴(kuò)展版本號(hào)info()輸出擴(kuò)展信息3.3反射
【案例】利用反射實(shí)現(xiàn)依賴注入構(gòu)造方法的依賴注入:在Container類(lèi)的make()方法創(chuàng)建對(duì)象前,先使用反射獲取給定類(lèi)的構(gòu)造方法的參數(shù),然后從參數(shù)中獲知該構(gòu)造方法依賴哪些對(duì)象普通方法的依賴注入:普通方法依賴某個(gè)類(lèi)時(shí),也可以通過(guò)參數(shù)來(lái)依賴注入3.4異常處理創(chuàng)建案例演示異常處理的使用:<?phpfunctiondivision($num1,$num2){if(!$num2){$e=newException('除數(shù)不能為0');throw$e; echo'拋出異常后,后面的代碼不執(zhí)行。';}return$num1/$num2;}
異常的拋出和捕獲3.4異常處理try{echodivision(1,0); echo'當(dāng)上一行代碼拋出異常時(shí),后面的代碼不會(huì)執(zhí)行';}catch(Exception$e){ echo$e->getMessage(); }finally{echo'<br>異常處理完成'; }echo'<br>將異常處理完成后,后面的代碼會(huì)繼續(xù)執(zhí)行';調(diào)用division()函數(shù),查看運(yùn)行結(jié)果:
異常的拋出和捕獲3.4異常處理
自定義異常Exception異常類(lèi)提供的方法:名稱說(shuō)明getFile()創(chuàng)建異常時(shí)的程序文件名稱getLine()獲取創(chuàng)建的異常所在文件中的行號(hào)ThrowablegetPrevious()返回異常鏈中的前一個(gè)異常getTrace()獲取異常追蹤信息getTraceAsString()獲取字符串類(lèi)型的異常追蹤信息3.4異常處理
自定義異常演示getLine()和getFile()方法的使用:try{thrownewException('errormessage');}catch(Exception$e){echo'發(fā)生異常的行號(hào):'.$e->getLine();echo'<br>發(fā)生異常的文件名:'.$e->getFile();}3.4異常處理
自定義異常案例演示自定義異常,創(chuàng)建MyException.php:<?phpclassMyExceptionextendsException{protected$msg='自定義異常信息';publicfunctiongetCustomMessage(){return$this->getMessage()?:$this->msg;}}3.4異常處理
自定義異常<?phprequire'./MyException.php';$email='thinkphp.test';try{if(!filter_var($email,FILTER_VALIDATE_EMAIL)){thrownewMyException('email地址不合法');}}catch(MyException$e){echo$e->getCustomMessage();//輸出結(jié)果:email地址不合法}3.4異常處理
多異常捕獲處理<?phprequire'./MyException.php';$email='tom@';try{if(!filter_var($email,FILTER_VALIDATE_EMAIL)){thrownewException('email地址不合法');}elseif(substr($email,strrpos($email,'@')+1)===''){thrownewMyException('不能使用作為郵箱地址');}}catch(MyException$e){//輸出結(jié)果:不能使用作為郵箱地址echo$e->getCustomMessage();}catch(Exception$e){echo$e->getMessage();//這行代碼不會(huì)執(zhí)行}3.4異常處理
多異常捕獲處理嵌套異常的捕獲處理:<?phprequire'./MyException.php';try{try{thrownewException();}catch(Exception$e){thrownewMyException('發(fā)生異常,請(qǐng)稍后再試');}}catch(MyException$e){//輸出結(jié)果:發(fā)生異常,請(qǐng)稍后再試echo$e->getMessage();}3.4異常處理
在框架中處理異常創(chuàng)建修改mytp.test項(xiàng)目的framework/library/mytp/App.php文件將exit()方法刪除,使用Exception()拋出異常exit('請(qǐng)求參數(shù)包含特殊字符!');thrownewException('請(qǐng)求參數(shù)包含特殊字符!');3.4異常處理
在框架中處理異常exit('請(qǐng)求的控制器'.$class.'不存在!');thrownewException('請(qǐng)求的控制器'.$class.'不存在!');3.4異常處理
在框架中處理異常exit('操作不存在:'.get_class($instance).'/'.$action.'()');thrownewException('操作不存在:'.get_class($instance).'/'.$action.'()');第4章數(shù)據(jù)庫(kù)和模板引擎PDO擴(kuò)展封裝DB類(lèi)封裝Model類(lèi)Smarty模板引擎學(xué)習(xí)目標(biāo)熟悉框架中對(duì)數(shù)據(jù)庫(kù)操作類(lèi)的封裝方法12掌握PDO擴(kuò)展的使用方法掌握模板引擎的使用方法3熟悉掌握掌握目錄?點(diǎn)擊查看本節(jié)相關(guān)知識(shí)點(diǎn)?點(diǎn)擊查看本節(jié)相關(guān)知識(shí)點(diǎn)封裝DB類(lèi)4.24.1PDO擴(kuò)展4.3封裝Model類(lèi)?點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu)?點(diǎn)擊查看本節(jié)相關(guān)知識(shí)點(diǎn)Smarty模板引擎4.4知識(shí)架構(gòu)4.1PDO擴(kuò)展1開(kāi)啟PDO擴(kuò)展2連接和選擇數(shù)據(jù)庫(kù)3執(zhí)行SQL語(yǔ)句4處理結(jié)果集知識(shí)架構(gòu)4.1PDO擴(kuò)展5預(yù)處理機(jī)制6為占位符綁定數(shù)據(jù)7PDO錯(cuò)誤處理8PDO事務(wù)處理知識(shí)架構(gòu)4.2【案例】封裝DB類(lèi)1連接數(shù)據(jù)庫(kù)2封裝查詢類(lèi)操作3封裝執(zhí)行類(lèi)操作知識(shí)架構(gòu)4.3【案例】封裝Model類(lèi)1初始化表名2查詢數(shù)據(jù)3新增數(shù)據(jù)4修改數(shù)據(jù)5刪除數(shù)據(jù)知識(shí)架構(gòu)4.4Smarty模板引擎1安裝Smarty2在框架中使用Smarty3Smarty常用模板語(yǔ)法4.1PDO擴(kuò)展
開(kāi)啟PDO擴(kuò)展在php.ini中找到“;extension=pdo_mysql”去掉分號(hào)注釋開(kāi)啟擴(kuò)展修改后重啟Apache4.1PDO擴(kuò)展
連接和選擇數(shù)據(jù)庫(kù)使用PDO操作數(shù)據(jù)庫(kù)前,先實(shí)例化PDO類(lèi),傳遞數(shù)據(jù)庫(kù)連接參數(shù)基本語(yǔ)法:PDO::__construct(
string$dsn, //數(shù)據(jù)源名稱
string$username, //用戶名(可選)string$password, //密碼(可選)
array$driver_options//包含鍵值的驅(qū)動(dòng)連接選項(xiàng))4.1PDO擴(kuò)展
連接和選擇數(shù)據(jù)庫(kù)PDO連接本地的MySQL服務(wù)器,選擇myframe數(shù)據(jù)庫(kù)$dsn='mysql:host=localhost;port=3306;dbname=myframe;charset=utf8mb4';$pdo=newPDO($dsn,'root','123456');var_dump($pdo);//輸出結(jié)果:object(PDO)#1(0){}4.1PDO擴(kuò)展
執(zhí)行SQL語(yǔ)句PDO提供了query()和exec()方法用于執(zhí)行SQL語(yǔ)句query()執(zhí)行成功時(shí)返回PDOStatement類(lèi)的對(duì)象,該對(duì)象主要用于解析結(jié)果集、實(shí)現(xiàn)預(yù)處理和事務(wù)處理等特殊功能exec()執(zhí)行成功后返回受影響行數(shù),此方法不會(huì)對(duì)SELECT語(yǔ)句返回結(jié)果4.1PDO擴(kuò)展
處理結(jié)果集fetch()方法:基本語(yǔ)法:mixedPDOStatement::fetch(int$fetch_style,//返回方式(可選)
//滾動(dòng)游標(biāo)(可選)int$cursor_orientation=PDO::FETCH_ORI_NEXT,int$cursor_offset=0//游標(biāo)的偏移量(可選))4.1PDO擴(kuò)展PDO::FETCH_*常用常量
處理結(jié)果集常量名說(shuō)明PDO::FETCH_ASSOC返回一個(gè)鍵為結(jié)果集字段名的關(guān)聯(lián)數(shù)組PDO::FETCH_BOTH(默認(rèn))返回一個(gè)索引為結(jié)果集列名和以0開(kāi)始的列號(hào)的數(shù)組PDO::FETCH_LAZY返回一個(gè)包含關(guān)聯(lián)數(shù)組、數(shù)字索引數(shù)組和對(duì)象的結(jié)果PDO::FETCH_NUM返回一個(gè)索引為以0開(kāi)始的結(jié)果集列號(hào)的數(shù)組PDO::FETCH_CLASS返回一個(gè)請(qǐng)求類(lèi)的新實(shí)例,映射結(jié)果集中的列名到類(lèi)中對(duì)應(yīng)的屬性名PDO::FETCH_OBJ返回一個(gè)屬性名對(duì)應(yīng)結(jié)果集列名的匿名對(duì)象4.1PDO擴(kuò)展
處理結(jié)果集fetchColumn()方法:基本語(yǔ)法:stringPDOStatement::fetchColumn([int$column_number=0])4.1PDO擴(kuò)展
處理結(jié)果集fetchAll()方法:基本語(yǔ)法:arrayPDOStatement::fetchAll(int$fetch_style, //返回方式(可選)mixed$fetch_argument,//滾動(dòng)游標(biāo)(可選)array$ctor_args=array()//PDO::FETCH_CLASS參數(shù))4.1PDO擴(kuò)展$fetch_argument參數(shù)的意義:
處理結(jié)果集$fetch_style取值$fetch_argument的意義PDO::FETCH_COLUMN返回指定以0開(kāi)始索引的列PDO::FETCH_CLASS返回指定類(lèi)的實(shí)例,映射每行的列到類(lèi)中對(duì)應(yīng)的屬性名PDO::FETCH_FUNC將每行的列作為參數(shù)傳遞給指定函數(shù),返回調(diào)用函數(shù)后的結(jié)果4.1PDO擴(kuò)展
PDO預(yù)處理機(jī)制prepare()方法用于準(zhǔn)備預(yù)處理的SQL語(yǔ)句,執(zhí)行成功時(shí)返回PDOStatement類(lèi)對(duì)象基本語(yǔ)法:publicPDOStatementPDO::prepare(
//預(yù)處理的SQL語(yǔ)句
string$statement,
//設(shè)置一個(gè)或多個(gè)PDOStatement對(duì)象的屬性值(可選)array$driver_options=array())4.1PDO擴(kuò)展
PDO預(yù)處理機(jī)制execute()方法用于執(zhí)行一條預(yù)處理語(yǔ)句基本語(yǔ)法:bool
PDOStatement::execute([array$input_parameters])4.1PDO擴(kuò)展
為占位符綁定數(shù)據(jù)bindParam()方法支持問(wèn)號(hào)占位符和參數(shù)占位符將占位符綁定到指定的變量名上在execute()執(zhí)行預(yù)處理語(yǔ)句時(shí),只要修改變量名的值即可//綁定問(wèn)號(hào)占位符$stmt->bindParam(1,$name);$stmt->bindParam(2,$entry_date);//綁定參數(shù)占位符$stmt->bindParam('參數(shù)標(biāo)識(shí)符名',$name);$stmt->bindParam('參數(shù)標(biāo)識(shí)符名',$entry_date);4.1PDO擴(kuò)展
為占位符綁定數(shù)據(jù)bindValue()方法在使用時(shí)是將值綁定到占位符上執(zhí)行execute()執(zhí)行預(yù)處理語(yǔ)句//綁定問(wèn)號(hào)占位符$stmt->bindValue(1,'Charles');$stmt->bindValue(2,'2019-1-1');$stmt->execute();//綁定參數(shù)占位符$stmt->bindValue('參數(shù)標(biāo)識(shí)符名','Charles');$stmt->bindValue('參數(shù)標(biāo)識(shí)符名','2019-1-1');$stmt->execute();4.1PDO擴(kuò)展
PDO錯(cuò)誤處理SILENT模式(默認(rèn)):此模式在錯(cuò)誤發(fā)生時(shí)不進(jìn)行任何操作,只簡(jiǎn)單的設(shè)置錯(cuò)誤代碼WARNING模式:在項(xiàng)目的調(diào)試期間,可以查看發(fā)生了什么問(wèn)題且不中斷程序的流程,當(dāng)錯(cuò)誤發(fā)生時(shí),PDO會(huì)發(fā)出一條E_WARNING信息EXCEPTION模式:在錯(cuò)誤發(fā)生時(shí)拋出相關(guān)異常。它在項(xiàng)目調(diào)試中較為實(shí)用可以快速的找到代碼中問(wèn)題的潛在區(qū)域4.1PDO擴(kuò)展
PDO錯(cuò)誤處理設(shè)置為SILENT模式$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_SILENT);設(shè)置為WARNING模式$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);設(shè)置為EXCEPTION模式$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);4.1PDO擴(kuò)展
PDO錯(cuò)誤處理<?php$dsn='mysql:host=localhost;port=3306;dbname=mytp;charset=utf8';$pdo=newPDO($dsn,'root','123456');$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);//預(yù)處理SQL語(yǔ)句$stmt=$pdo->prepare('SELECT*FROM`test`');//執(zhí)行預(yù)處理語(yǔ)句,若execute()方法返回false,表示執(zhí)行失敗if(false===$stmt->execute()){echo'錯(cuò)誤碼:'.$stmt->errorCode().'<br>';//輸出錯(cuò)誤碼print_r($stmt->errorInfo());//輸出錯(cuò)誤信息}使用PDO操作數(shù)據(jù)庫(kù)前,先實(shí)例化PDO類(lèi),傳遞數(shù)據(jù)庫(kù)連接參數(shù)4.1PDO擴(kuò)展
PDO錯(cuò)誤處理WARNING模式案例輸出結(jié)果:4.1PDO擴(kuò)展
PDO事務(wù)處理PDO類(lèi)事務(wù)相關(guān)的操作方法方法名說(shuō)明PDO::beginTransaction()啟動(dòng)一個(gè)事務(wù)PDO::commit()提交一個(gè)事務(wù)PDO::inTransaction()檢查是否在一個(gè)事務(wù)內(nèi)PDO::rollBack()回滾一個(gè)事務(wù)4.1PDO擴(kuò)展
PDO事務(wù)處理案例演示事務(wù)的使用:$pdo->beginTransaction();try{$stmt=$pdo->prepare('INSERTINTO`student`(`name`)VALUES(?)');$stmt->execute(['小明']);$pdo->commit();}catch(PDOException$e){$pdo->rollBack();echo'執(zhí)行失?。?.$e->getMessage();}4.2【案例】封裝DB類(lèi)
連接數(shù)據(jù)庫(kù)DB類(lèi)的主要負(fù)責(zé)數(shù)據(jù)庫(kù)操作,職責(zé)包括:連接數(shù)據(jù)庫(kù)執(zhí)行SQL語(yǔ)句處理結(jié)果集4.2【案例】封裝DB類(lèi)
連接數(shù)據(jù)庫(kù)實(shí)現(xiàn)思路:創(chuàng)建DB類(lèi),實(shí)現(xiàn)getInstance()用來(lái)連接數(shù)據(jù)庫(kù),init()用來(lái)傳入連接配置編寫(xiě)initPDO()方法,用來(lái)實(shí)例化PDO對(duì)象,連接數(shù)據(jù)庫(kù)在控制器中調(diào)用DB類(lèi)getInsance()方法,查看是否實(shí)現(xiàn)連接數(shù)據(jù)庫(kù)的功能4.2【案例】封裝DB類(lèi)
封裝查詢類(lèi)操作查詢類(lèi)操作是指SELECT這種有結(jié)果集的操作在DB類(lèi)中實(shí)現(xiàn)查詢一條或多條數(shù)據(jù)的方法在控制器中使用DB類(lèi)中的查詢類(lèi)的方法4.2【案例】封裝DB類(lèi)
封裝執(zhí)行類(lèi)操作執(zhí)行類(lèi)操作包括INSERT、UPDATE、DELETE,執(zhí)行后會(huì)返回受影響的行數(shù)并提供獲取自動(dòng)增長(zhǎng)字段最后插入的id值在DB類(lèi)中實(shí)現(xiàn)執(zhí)行查詢的方法和獲取最后插入數(shù)據(jù)id的方法在控制器中使用DB類(lèi)中的執(zhí)行類(lèi)的方法4.3【案例】封裝Model類(lèi)
初始化表名創(chuàng)建Model類(lèi),實(shí)現(xiàn)初始化表名功能當(dāng)子類(lèi)繼承Model類(lèi)時(shí),在子類(lèi)中可以自定義表名如果沒(méi)有自定義表名,則自動(dòng)將子類(lèi)的類(lèi)名轉(zhuǎn)換為表名4.3【案例】封裝Model類(lèi)
查詢數(shù)據(jù)get()用來(lái)查詢多條記錄,參數(shù)為字段數(shù)組,如果省略參數(shù),表示所有字段first()用來(lái)查詢一條記錄,參數(shù)為字段數(shù)組,如果省略參數(shù),表示所有字段value()用來(lái)查詢單個(gè)字段,參數(shù)為字段名4.3【案例】封裝Model類(lèi)
新增數(shù)據(jù)insert()新增的數(shù)據(jù)以數(shù)組傳入,返回的結(jié)果是新增的記錄數(shù)insertGetId()新增的數(shù)據(jù)以數(shù)組傳入,返回的結(jié)果是最后插入的ID4.3【案例】封裝Model類(lèi)
修改數(shù)據(jù)編寫(xiě)修改數(shù)據(jù)的update()方法將要修改的數(shù)據(jù)以數(shù)組的形式傳入即可,返回的結(jié)果為受影響的行數(shù)update()方法的使用:$student->where('id',
5)->update([
'name'
=>
'new',
'gender'
=>
'男']);4.3【案例】封裝Model類(lèi)
刪除數(shù)據(jù)編寫(xiě)刪除數(shù)據(jù)的delete()方法,用來(lái)執(zhí)行DELETE語(yǔ)句其返回結(jié)果為被刪除的條數(shù)delete()方法的使用:$count=$student->where('id','>','4')->delete();4.4模板引擎使用Composer可以為項(xiàng)目安裝Smarty模板引擎:composerrequiresmarty/smarty=~3.1
安裝Smarty4.4模板引擎打開(kāi)vendor/smarty/smarty/libs,Smarty的libs目錄文件介紹:
安裝Smarty名稱說(shuō)明Smarty.class.phpSmarty核心類(lèi)文件,用于實(shí)現(xiàn)Smarty模板引擎的功能SmartyBC.class.phpSmarty為了向前兼容Smarty2版本而設(shè)置了這個(gè)類(lèi)Autoloader.phpSmarty中實(shí)現(xiàn)自動(dòng)載入文件功能的類(lèi)debug.tplSmarty中的debug模板文件plugins自定義插件目錄,存放各類(lèi)自定義插件的目錄sysplugins存放系統(tǒng)文件目錄4.4模板引擎配置模板文件目錄和編譯文件目錄創(chuàng)建基礎(chǔ)控制器類(lèi),將Smarty的初始化代碼寫(xiě)在該類(lèi)的構(gòu)造方法中其他控制器類(lèi)繼承基礎(chǔ)控制器類(lèi),就能使用Smarty
在框架中使用Smarty4.4模板引擎
在框架中使用Smartypublicfunctiontest(){//調(diào)用assign()方法為模板中的變量賦值,格式為assign(變量名,值)$this->Smarty->assign('title','Smarty');$this->Smarty->assign('desc','Smarty是一個(gè)PHP的模板引擎');//調(diào)用fetch()方法渲染模板文件,返回渲染的HTML結(jié)果字符串return$this->Smarty->fetch('test.html');}4.4模板引擎創(chuàng)建test.html文件:<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>Smarty示例</title></head><body><h1>Hello{$title}</h1><p>{$desc}</p></body></html>
在框架中使用Smarty4.4模板引擎
Smarty常用模板語(yǔ)法將數(shù)據(jù)庫(kù)查詢結(jié)果輸出到模板中,通過(guò)foreach遍歷一個(gè)數(shù)組或?qū)ο髞?lái)實(shí)現(xiàn)在頁(yè)面中需要進(jìn)行判斷,則使用if語(yǔ)句來(lái)實(shí)現(xiàn)4.4模板引擎
Smarty常用模板語(yǔ)法foreach語(yǔ)句使用示例:{foreach$studentas$v}<tr><td>{$}</td><td>{$v.gender}</td></tr>{/foreach}4.4模板引擎
Smarty常用模板語(yǔ)法if語(yǔ)句使用示例:{if$v.gender=='男'}<fontcolor="red">{$}</font>{else}{$}{/if}第5章內(nèi)容管理系統(tǒng)(上)項(xiàng)目展示后臺(tái)用戶登錄驗(yàn)證碼后臺(tái)頁(yè)面搭建欄目管理學(xué)習(xí)目標(biāo)掌握運(yùn)用框架進(jìn)行項(xiàng)目開(kāi)發(fā)的方法12掌握在框架中對(duì)表單進(jìn)行處理的方法掌握驗(yàn)證碼功能的開(kāi)發(fā)方法3掌握掌握掌握掌握4掌握會(huì)話技術(shù)的使用方法目錄?點(diǎn)擊查看本節(jié)相關(guān)知識(shí)點(diǎn)?點(diǎn)擊查看本節(jié)相關(guān)知識(shí)點(diǎn)后臺(tái)用戶登錄5.25.1項(xiàng)目展示5.3驗(yàn)證碼?點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu)目錄?點(diǎn)擊查看本節(jié)相關(guān)知識(shí)點(diǎn)?點(diǎn)擊查看本節(jié)相關(guān)知識(shí)點(diǎn)欄目管理5.55.4后臺(tái)頁(yè)面搭建知識(shí)架構(gòu)5.2后臺(tái)用戶登錄1創(chuàng)建用戶表2顯示登錄頁(yè)面3Ajax交互4接收登錄表單5判斷登錄狀態(tài)6退出登錄知識(shí)架構(gòu)5.3驗(yàn)證碼1編寫(xiě)驗(yàn)證碼類(lèi)2輸出驗(yàn)證碼圖像3判斷驗(yàn)證碼是否正確知識(shí)架構(gòu)5.4后臺(tái)頁(yè)面搭建1后臺(tái)布局2左側(cè)菜單3后臺(tái)首頁(yè)知識(shí)架構(gòu)5.5欄目管理1創(chuàng)建欄目表2顯示欄目列表3添加和修改欄目4刪除欄目
項(xiàng)目展示前臺(tái)首頁(yè):頂部是導(dǎo)航欄,導(dǎo)航欄左側(cè)是網(wǎng)站的LOGO,右側(cè)是欄目菜單導(dǎo)航欄的下
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 蘭州博文科技學(xué)院《文化項(xiàng)目案例解讀》2023-2024學(xué)年第一學(xué)期期末試卷
- 山東省淄博市恒臺(tái)縣2025屆三年級(jí)數(shù)學(xué)第二學(xué)期期末聯(lián)考模擬試題含解析
- 云南省曲靖市馬龍縣2025屆四下數(shù)學(xué)期末經(jīng)典模擬試題含解析
- 華北水利水電大學(xué)《文學(xué)改編影視研究》2023-2024學(xué)年第二學(xué)期期末試卷
- 山西傳媒學(xué)院《汽車(chē)美容與裝飾》2023-2024學(xué)年第二學(xué)期期末試卷
- 天津石油職業(yè)技術(shù)學(xué)院《測(cè)試技術(shù)與信號(hào)處理》2023-2024學(xué)年第二學(xué)期期末試卷
- 長(zhǎng)春電子科技學(xué)院《高級(jí)日語(yǔ)聽(tīng)力I》2023-2024學(xué)年第二學(xué)期期末試卷
- 江西省宜春市四校2025年高三下期中考試(物理試題文)試題含解析
- 銀川第二中學(xué)2024-2025學(xué)年高三下學(xué)期總復(fù)習(xí)階段測(cè)試生物試題試卷含解析
- 2024北京五中分校初二(下)期中數(shù)學(xué)試題及答案
- 礦山協(xié)議合同范本
- 【抖音直播帶貨發(fā)展中存在的問(wèn)題及對(duì)策(任務(wù)書(shū)+開(kāi)題報(bào)告)3400字】
- 【基于單片機(jī)的兒童防走失模塊設(shè)計(jì)11000字】
- 建筑施工企業(yè)主要負(fù)責(zé)人(A類(lèi))題庫(kù)與參考答案
- DZ∕T 0382-2021 固體礦產(chǎn)勘查地質(zhì)填圖規(guī)范(正式版)
- 2024年時(shí)事政治必考題庫(kù)及答案(真題匯編)
- 《研學(xué)旅行課程設(shè)計(jì)》課件-研學(xué)課程方案設(shè)計(jì)
- 教科版六年級(jí)下學(xué)期小升初科學(xué)模擬試卷(附答案)
- 林長(zhǎng)巡查工作實(shí)施方案
- AQ 2079-2020 海洋石油生產(chǎn)設(shè)施發(fā)證檢驗(yàn)工作通則
- ifix培訓(xùn)教程課件
評(píng)論
0/150
提交評(píng)論