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 相关文章推荐
在任意字符集下正常显示网页的方法二(续)
Apr 01 PHP
php设计模式 Delegation(委托模式)
Jun 26 PHP
php获取apk包信息的方法
Aug 15 PHP
PHP使用ob_start生成html页面的方法
Nov 07 PHP
javascript数组与php数组的地址传递及值传递用法实例
Jan 22 PHP
php从数组中随机选择若干不重复元素的方法
Mar 14 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
Mar 01 PHP
php好代码风格的阶段性总结
Jun 25 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
Sep 02 PHP
php 调用ffmpeg获取视频信息的简单实现
Apr 03 PHP
php生成毫秒时间戳的实例讲解
Sep 22 PHP
PHP实现倒计时功能
Nov 16 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-cli简介(不会Shell语言一样用Shell)
2013/06/03 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
索趣科技的答案
2007/02/07 Javascript
极酷的javascirpt,让你随意编辑任何网页
2007/02/25 Javascript
jquery中的$(document).ready()与window.onload的区别
2009/11/18 Javascript
jQuery ul标签下拉菜单演示代码
2010/12/11 Javascript
javascript里模拟sleep(两种实现方式)
2013/01/25 Javascript
js跨浏览器实现将字符串转化为xml对象的方法
2013/09/25 Javascript
JS 屏蔽按键效果与改变按键效果的示例代码
2013/12/24 Javascript
js显示当前日期时间和星期几
2015/10/22 Javascript
jquery实现横向图片轮播特效代码分享
2015/11/19 Javascript
利用JS制作万年历的方法
2017/08/16 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
2017/09/04 Javascript
js代码规范之Eslint安装与配置详解
2018/09/08 Javascript
利用React Router4实现的服务端直出渲染(SSR)
2019/01/07 Javascript
js中offset,client , scroll 三大元素知识点总结
2019/09/11 Javascript
使用webpack将ES6转化ES5的实现方法
2019/10/13 Javascript
解析Mac OS下部署Pyhton的Django框架项目的过程
2016/05/03 Python
python字典DICT类型合并详解
2017/08/17 Python
Python采集代理ip并判断是否可用和定时更新的方法
2018/05/07 Python
python3.4实现邮件发送功能
2018/05/28 Python
基于Tensorflow批量数据的输入实现方式
2020/02/05 Python
Django Admin后台添加数据库视图过程解析
2020/04/01 Python
Keras 使用 Lambda层详解
2020/06/10 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
2020/06/30 Python
简单的Python人脸识别系统
2020/07/14 Python
Python高并发解决方案实现过程详解
2020/07/31 Python
CSS3用@font-face实现自定义英文字体
2013/09/23 HTML / CSS
纯CSS实现右侧底部悬浮效果(悬浮QQ、微信、微博、邮箱等联系方式)
2015/04/24 HTML / CSS
Html5实现用户注册自动校验功能实例代码
2016/05/24 HTML / CSS
澳大利亚波西米亚风连衣裙在线商店:Fortunate One
2019/04/01 全球购物
请解释在new与override的区别
2012/10/29 面试题
XMLHttpRequest对象在IE和Firefox中创建方式有没有不同
2016/03/23 面试题
观看焦裕禄观后感
2015/06/09 职场文书
Python中np.random.randint()参数详解及用法实例
2022/09/23 Python