PHP MVC框架中類的自動(dòng)加載機(jī)制實(shí)例分析
本文實(shí)例講述了PHP MVC框架中類的自動(dòng)加載機(jī)制。分享給大家供大家參考,具體如下:
原文
實(shí)現(xiàn)類的自動(dòng)加載主要使用到了set_include_path
和spl_autoload_register
函數(shù)。
set_include_path
用于提前設(shè)置好可能會(huì)加載的類的路徑。
spl_autoload_register
用于調(diào)用相關(guān)自動(dòng)加載所需類的函數(shù),實(shí)現(xiàn)自動(dòng)載入的功能。
有一點(diǎn)要注意的是:自動(dòng)加載在實(shí)例化類的時(shí)候執(zhí)行,也就是說使用extends繼承類的時(shí)候,是不會(huì)自動(dòng)加載父類的。
設(shè)置目錄如下:
實(shí)現(xiàn)自動(dòng)加載功能相關(guān)的文件有:Loader.php,config.php,boot.php,index.php
config.php
<?php /** * Created by PhpStorm. * User: koastal * Date: 2016/5/15 * Time: 10:48 */ define("APP_PATH",__DIR__."/.."); define("Controller_PATH",__DIR__."/../controller"); define("Model_PATH",__DIR__."/../model"); define("View_PATH",__DIR__."/../view");
Loader.php
<?php /** * Created by PhpStorm. * User: koastal * Date: 2016/5/15 * Time: 12:03 */ class Loader { public static function baseLoad() { require_once("Controller.php"); require_once("Model.php"); } public static function autoload($class) { $path = $class.".class.php"; require_once($path); } } $include = array(Controller_PATH, Model_PATH,View_PATH); set_include_path(get_include_path() . PATH_SEPARATOR .implode(PATH_SEPARATOR, $include)); spl_autoload_register(array('Loader', 'autoload')); Loader::baseLoad();
boot.php
<?php /** * Created by PhpStorm. * User: koastal * Date: 2016/5/15 * Time: 12:19 */ require_once("Loader.php");
index.php
<?php require_once(__DIR__."/libs/config.php"); require_once(__DIR__."/libs/boot.php"); $obj = new testController(); $obj->show();
經(jīng)測(cè)試,以上代碼可用,全文完。
加更
經(jīng)測(cè)試上面的代碼,在訪問不存在的控制器是會(huì)報(bào)錯(cuò),找不到相關(guān)類文件。因?yàn)槲覀內(nèi)鄙倥袛嘞嚓P(guān)類文件是否存在。因此,我們對(duì)Loader.php進(jìn)行優(yōu)化,首先掃描相關(guān)類文件是否存在,如果不存在則報(bào)錯(cuò)。
<?php /** * Created by PhpStorm. * User: koastal * Date: 2016/5/15 * Time: 12:03 */ require_once 'config.php'; class Loader { public static function baseLoad() { require_once("Controller.php"); require_once("Model.php"); } public static function searchFile($filename,$path) { $filePath = false; $list = scandir($path); foreach($list as $file){ $realPath = $path.DIRECTORY_SEPARATOR.$file; if(is_dir($realPath) && $file!='.' && $file!='..'){ $res = Loader::searchFile($filename,$realPath); if($res){ return $res; } }elseif($file!='.' && $file!='..'){ if($file == $filename){ $filePath = $realPath; break; } } } return $filePath; } public static function autoload($class) { $filename = $class.".class.php"; $cflag = Loader::searchFile($filename,Controller_PATH); $mfalg = Loader::searchFile($filename,Model_PATH); $path = false; $path = ($cflag != false)? $cflag:$path; $path = ($mfalg != false)? $mfalg:$path; if($path == false){ exit("Class Load Failed."); }else{ require_once($path); } } } Loader::baseLoad(); spl_autoload_register(array('Loader', 'autoload'));
更多關(guān)于php框架相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php優(yōu)秀開發(fā)框架總結(jié)》、《codeigniter入門教程》、《ThinkPHP入門教程》、《Zend FrameWork框架入門教程》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
php實(shí)現(xiàn)的SSO單點(diǎn)登錄系統(tǒng)接入功能示例分析
這篇文章主要介紹了php實(shí)現(xiàn)的SSO單點(diǎn)登錄系統(tǒng)接入功能,簡(jiǎn)單分析了SSO單點(diǎn)登錄系統(tǒng)接入的原理與php相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-10-10PHP實(shí)現(xiàn)單文件、多個(gè)單文件、多文件上傳函數(shù)的封裝示例
這篇文章主要介紹了PHP實(shí)現(xiàn)單文件、多個(gè)單文件、多文件上傳函數(shù)的封裝,結(jié)合實(shí)例形式詳細(xì)分析了php文件上傳的原理及針對(duì)文件上傳函數(shù)的封裝相關(guān)操作技巧,需要的朋友可以參考下2019-09-09PHP正則表達(dá)式匹配替換與分割功能實(shí)例淺析
這篇文章主要介紹了PHP正則表達(dá)式匹配替換與分割功能,簡(jiǎn)單分析了php正則匹配、替換與分割相關(guān)函數(shù),并結(jié)合實(shí)例形式演示了php正則匹配的相關(guān)操作技巧,需要的朋友可以參考下2017-02-02PHP學(xué)習(xí)筆記 IIS7下安裝配置php環(huán)境
PHP學(xué)習(xí)筆記 IIS7下安裝配置php環(huán)境,需要的朋友可以參考下2012-10-10