PHP MVC框架中类的自动加载机制实例分析
作者:koastal 发布时间:2023-11-04 09:18:09
标签:PHP,MVC,自动加载
本文实例讲述了PHP MVC框架中类的自动加载机制。分享给大家供大家参考,具体如下:
原文
实现类的自动加载主要使用到了set_include_path
和spl_autoload_register
函数。
set_include_path
用于提前设置好可能会加载的类的路径。
spl_autoload_register
用于调用相关自动加载所需类的函数,实现自动载入的功能。
有一点要注意的是:自动加载在实例化类的时候执行,也就是说使用extends继承类的时候,是不会自动加载父类的。
设置目录如下:
实现自动加载功能相关的文件有: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();
经测试,以上代码可用,全文完。
加更
经测试上面的代码,在访问不存在的控制器是会报错,找不到相关类文件。因为我们缺少判断相关类文件是否存在。因此,我们对Loader.php进行优化,首先扫描相关类文件是否存在,如果不存在则报错。
<?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'));
希望本文所述对大家PHP程序设计有所帮助。
来源:https://blog.csdn.net/koastal/article/details/51417030


猜你喜欢
- PlaywrightPlaywright 是微软公司开源的一款 UI 自动化测试工具,它的第一个版本 v0.10.0 发布于 2020 年
- 需求每天往一个表里面插入两条数据,但日期不同INSERT INTO test(`id`, `art_training_institution
- 代码如下:<% Randomize Do While Len(pass)<12 
- 查询7天连续登陆用户这个问题很经典,解决方法也有很多,这里我讲一下笔者的方法,希望对大家有帮助。具体思路:1、因为每天用户登录次数可能不止一
- 一.什么是Vuex? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规
- 引子vuejs 是一个入门简单的框架,具有使用简单,扩展方便的特点。随着webpack的流行,vuejs也推出了自己的load,vue-lo
- 大家在使用MySQL查询时正常是直接一个表的查询,要不然也就是多表的关联查询,使用到了左联结(left join)、右联结(right jo
- Python 是最流行、功能最强大的编程语言之一。由于它是自由开源的,因此每个人都可以使用。大多数 Fedora 系统都已安装了该语言。Py
- expand表示是否把series类型转化为DataFrame类型下面代码中的n表示去掉下划线"_"的数量代码如下:im
- DFA 算法是通过提前构造出一个 树状查找结构,之后根据输入在该树状结构中就可以进行非常高效的查找。设我们有一个敏感词库,词酷中的词汇为:我
- tensorflow作为google开源的项目,现在赶超了caffe,好像成为最受欢迎的深度学习框架。确实在编写的时候更能感受到代码的真实存
- 最近接到一个任务,就是用django后端,前段用vue,做一个普通的简单系统,我就是一搞后端的,听到vue也是比较震惊,之前压根没接触过vu
- show.php源代码: <? if ($action=="cp"){ echo"<div ali
- 今天呢,田辛老师来给大家继续讲一个著名的项目管理工具:蒙特卡洛模拟。 当然,田辛老师既然发到CSDN上面,无论如何要给出关于蒙特卡洛模拟的P
- Python里的正则表达式Python里的正则表达式,无需下载外部模块,只需要引入自带模块:re:import re官方re模块文档: ht
- 在我们平常使用Python进行数据处理与分析时,在import完一大堆库之后,就是对数据进行预览,查看数据是否出现了缺失值、重复值等异常情况
- vue中代码的复用, 为我们提供了 mixnis. 模板的复用, 为我们提供了 插槽( slot )插槽的分类默认插槽具名插槽作用域插槽当我
- 很多现代的浏览器在地址栏的右边有个搜索框,默认的安装有 Google 搜索等。如下图所示:其实这是 OpenSearch 的一个应用,只要编
- 假设现在有一个需求将以下 url 保存起来,要求不重复www.baidu.comwww.sina.com.cnwww.hao123.comw
- windows下如果同时安装了python 32 位版本和64位版本,如何简便地启动指定的版本?# 启动python 3 32位版本py -