




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