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
0
投稿
猜你喜欢
- 关于php的引用(就是在变量或者函数、对象等前面加上&符号)的作用,我们先看下面这个程序。<?php
- #coding:utf-8 #批量修改文件名 import os import re import datetime re_st = r
- 译序:这篇文章是可用性大师 Jakob Nielsen 在10年前总结的,到今天仍然受用。通过这个时间跨度,可以得出,可用性话题不是某个时代
- 阅读上一篇:FrontPage2002简明教程六:图片库 虽然FrontPage已经给我们提供了很多面很强大的所见即所得的工具,但是随着HT
- argparse 是python自带的命令行参数解析包,可以用来方便地读取命令行参数。一、传入一个参数import argpars
- 即使MyISAM表格式非常可靠(SQL语句对表做的所有改变在语句返回之前被写下),如果下列任何事件发生,你依然可以获得损坏的表:&m
- 主函数(Main Function)是程序中最重要的部分之一,它是程序入口点,也是程序开始执行的地方。1、主函数的定义在 Python 中,
- 生成方式Python中想要自动生成 model文件可以通过 sqlacodegen这个命令来生成对应的model文件sqlacodegen
- 提高SQL执行效率的几点建议:◆尽量不要在where中包含子查询;关于时间的查询,尽量不要写成:where to_char(dif_date
- PHP addcslashes() 函数实例在字符 "W" 前添加反斜杠:<?php $str = addcsla
- 上文:栅格:从混乱到秩序Jacci Howard Bear 的英文原文:http://desktoppub.about.com/od/gri
- Function Comma(str)If Not(IsNumeric(str)) Or 
- 在IE进行文档链接时,如果遇到OLE支持的文档,IE会自动调用相应程序打开它,有时候这种功能并不是我们所需的,虽然我们可以提醒用户用鼠标右键
- 突然有个想法,不知道是不是首创:用"表情符号"做植入广告. 目前的表情符号 "黄色小圆脸"系列可以说
- 瞬间设计是什么?良好的用户体验,全在于那些完美的瞬间。在第一个瞬间,假设当一位用户从购物搜索结果页面跳转到某个店铺的时候,他此刻可能是想看看
- 今天把博客的日历脚本又改了一改,就帖上了,以后找起来方便一点,同时也给需要的人带来方便,本来还想加点功能再帖上来,不过我看还是没必要了,帖的
- 刚刚有人问我二年前写的那个小三角的效果还能作出什么样的效果,我正在看电视,画面上出现了这样一个小灯笼,于是,我就说,可以作个小灯笼玩玩。于是
- check.asp 代码如下:<% '''''''''
- 与没有数据库的网站相比,数据库的存取会降低你的系统性能。但是大多数情况下,网站和数据库有密不可分的关系,正是数据库给站点提供了大容量、多样性
- 如何在页面中实现对电子信箱的访问?emaile.htm<HTML><HEAD><META NAME=