php自动加载的两种实现方法


Posted in PHP onJune 21, 2010

php自动载方法有两种.
第一种方案用__autoload,这个函数较简单,也较弱.
但有一问题没有解决, 就是在include前判断文件是否存在的问题.

set_include_path('aa' . PATH_SEPARATOR . get_include_path()); 
function __autoload($className) 
{ 
//如果加这个检测, 因为此文件不在当前目录下,它就会检测不到文件存在, 
//但include是能成功的 
if (file_exists($className . '.php')) { 
include_once($className . '.php'); 
} else { 
exit('no file'); 
} 
} 
$a = new Acls();

第二种方案用spl自动加载,这里具体说一下这个.
spl_autoload_register()
一个简单的例子
set_include_path('aa' . PATH_SEPARATOR . get_include_path()); 
//function __autoload($className) 
//{ 
// if (file_exists($className . '.php')) { 
// include_once($className . '.php'); 
// } else { 
// exit('no file'); 
// } 
//} 
spl_autoload_register(); 
$a = new Acls();

spl_autoload_register()会自动先调用spl_autoload()在路径中查找具有小写文件名的".php"程序.默认查找的扩展名还有".ini",还可以用spl_autoload_extenstions()注册扩展名.
在找不到的清况下,还可以通过自己定义函数查找

function loader1($class)
{
//自己写一些加载的代码
}
function loader2($class)
{
//当loader1()找不到时,我来找
}
spl_autoload_register('loader1');
spl_autoload_register('loader2');
还可以更多........
MVC框架是如何实现自动加载的
首先设置路径
'include' => array( 'application/catalog/controllers', 'application/catalog/models', ),$include = array('application/controllers', 'application/models', 'application/library');
set_include_path(get_include_path() . PATH_SEPARATOR .implode(PATH_SEPARATOR, $config['include']));
在获取URL,解析出控制器与方法.
然后设置自动加载
class Loader 
{ 
/** 
* 自动加载类 
* @param $class 类名 
*/ 
public static function autoload($class) 
{ 
$path = ''; 
$path = str_replace('_', '/', $class) . '.php'; 
include_once($path); 
} 
} 
/** 
* sql自动加载 
*/ 
spl_autoload_register(array('Loader', 'autoload'));

路由,实例化控制器,调用方法,你写的东西就开始执行了
/** 
* 路由 
*/ 
public function route() 
{ 
if (class_exists($this->getController())) { 
$rc = new ReflectionClass($this->getController()); 
if ($rc->hasMethod($this->getAction())) { 
$controller = $rc->newInstance(); 
$method = $rc->getMethod($this->getAction()); 
$method->invoke($controller); 
} else 
throw new Exception('no action'); 
} else 
throw new Exception('no controller'); 
}

初步的自动加载就完成了
PHP 相关文章推荐
PHP读MYSQL中文乱码的解决方法
Dec 17 PHP
php数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
Oct 31 PHP
PHP查询数据库中满足条件的记录条数(两种实现方法)
Jan 29 PHP
PHP内核探索:变量存储与类型使用说明
Jan 30 PHP
PHP中的gzcompress、gzdeflate、gzencode函数详解
Jul 29 PHP
windows7下php开发环境搭建图文教程
Jan 06 PHP
yii2.0实现pathinfo的形式访问的配置方法
Apr 06 PHP
深入理解PHP 数组之count 函数
Jun 13 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
Nov 14 PHP
php从数据库读取数据,并以json格式返回数据的方法
Aug 21 PHP
php如何计算两坐标点之间的距离
Dec 29 PHP
PHP单元测试配置与使用方法详解
Dec 27 PHP
PHP定时自动生成静态HTML的实现代码
Jun 20 #PHP
PHP XML操作的各种方法解析(比较详细)
Jun 17 #PHP
PHP操作xml代码
Jun 17 #PHP
PHP XML error parsing SOAP payload on line 1
Jun 17 #PHP
PHP zlib扩展实现页面GZIP压缩输出
Jun 17 #PHP
PHP,ASP.JAVA,JAVA代码格式化工具整理
Jun 15 #PHP
PHP迅雷、快车、旋风下载专用链转换代码
Jun 15 #PHP
You might like
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
2016/10/25 PHP
php删除txt文件指定行及按行读取txt文档数据的方法
2017/01/30 PHP
ThinkPHP中图片按比例切割的代码实例
2019/03/08 PHP
如何实现浏览器上的右键菜单
2006/07/10 Javascript
js中判断文本框是否为空的两种方法
2011/07/31 Javascript
打豆豆小游戏 用javascript编写的[打豆豆]小游戏
2013/01/08 Javascript
javascript中自定义对象的属性方法分享
2013/07/12 Javascript
JS的Document属性和方法小结
2013/09/17 Javascript
jQuery实现仿腾讯迷你首页选项卡效果代码
2015/09/17 Javascript
JavaScript重载函数实例剖析
2016/05/13 Javascript
Vue.js常用指令汇总(v-if、v-for等)
2016/11/03 Javascript
jquery实现文本框的禁用和启用
2016/12/07 Javascript
快速入门Vue
2016/12/19 Javascript
用ES6写全屏滚动插件的示例代码
2018/05/02 Javascript
深入理解JS中Number(),parseInt(),parseFloat()三者比较
2018/08/24 Javascript
Vue自定义组件的四种方式示例详解
2020/02/28 Javascript
Node.js中出现未捕获异常的处理方法
2020/06/29 Javascript
小程序实现可拖动的悬浮按钮
2020/09/07 Javascript
vue v-model的用法解析
2020/10/19 Javascript
python使用urlparse分析网址中域名的方法
2015/04/15 Python
使用Python压缩和解压缩zip文件的教程
2015/05/06 Python
python获取目录下所有文件的方法
2015/06/01 Python
python先序遍历二叉树问题
2017/11/10 Python
python正则表达式面试题解答
2020/04/28 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
Python unittest单元测试框架实现参数化
2020/04/29 Python
python正则表达式re.match()匹配多个字符方法的实现
2021/01/27 Python
Brydge英国:适用于Apple iPad和Microsoft Surface Pro的蓝牙键盘
2019/05/16 全球购物
三月学雷锋月活动总结
2014/04/28 职场文书
难忘的一天教学反思
2014/04/30 职场文书
巾帼文明岗事迹材料
2014/12/24 职场文书
处罚决定书范文
2015/06/24 职场文书
证婚人致辞精选
2015/07/28 职场文书
Redis如何一键部署脚本
2021/04/12 Redis
Springboot如何使用logback实现多环境配置?
2021/06/16 Java/Android