本文實(shí)例講述了PHP MVC框架中類的自動(dòng)加載機(jī)制。分享給大家供大家參考,具體如下:
原文
實(shí)現(xiàn)類的自動(dòng)加載主要使用到了set_include_path
和spl_autoload_register
函數(shù)。
set_include_path
用于提前設(shè)置好可能會加載的類的路徑。
spl_autoload_register
用于調(diào)用相關(guān)自動(dòng)加載所需類的函數(shù),實(shí)現(xiàn)自動(dòng)載入的功能。
有一點(diǎn)要注意的是:自動(dòng)加載在實(shí)例化類的時(shí)候執(zhí)行,也就是說使用extends繼承類的時(shí)候,是不會自動(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)測試,以上代碼可用,全文完。
加更
經(jīng)測試上面的代碼,在訪問不存在的控制器是會報(bào)錯(cuò),找不到相關(guān)類文件。因?yàn)槲覀內(nèi)鄙倥袛嘞嚓P(guān)類文件是否存在。因此,我們對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ù)庫操作技巧匯總》
希望本文所述對大家PHP程序設(shè)計(jì)有所幫助。
您可能感興趣的文章:- php框架CI(codeigniter)自動(dòng)加載與自主創(chuàng)建對象操作實(shí)例分析
- PHP類的自動(dòng)加載與命名空間用法實(shí)例分析
- PHP 命名空間和自動(dòng)加載原理與用法實(shí)例分析
- PHP 自動(dòng)加載類原理與用法實(shí)例分析
- php自動(dòng)加載代碼實(shí)例詳解