php _autoload自动加载类与机制分析


Posted in PHP onFebruary 10, 2012

在PHP5之前,如果需要使用一个类,只需要直接使用include/require将其包含进来即可
test.class.php

<?php 
class abc{ 
function __construct() 
{ 
echo 'www.hzhuti.com; 
} 
} 
?>

load.php
代码如下
<?php 
class LOAD 
{ 
static function loadClass($class_name) 
{ 
$filename = $class_name.".class.php"; 
if (is_file($filename)) return include_once $filename; 
} 
} 
/** 
* 设置对象的自动载入 
* spl_autoload_register — Register given function as __autoload() implementation 
*/ 
spl_autoload_register(array('LOAD', 'loadClass')); 
$a = new Test();//实现自动加载,很多框架就用这种方法自动加载类 
?>

__autoload()
在实际项目中,不可能把所有的类都写在一个 PHP 文件中,当在一个 PHP 文件中需要调用另一个文件中声明的类时,就需要通过 include 把这个文件引入。不过有的时候,在文件众多的项目中,要一一将所需类的文件都 include 进来,一个很大的烦恼是不得不在每个类文件开头写一个长长的包含文件的列表。我们能不能在用到什么类的时候,再把这个类所在的 php 文件导入呢?
为此,PHP 提供了 __autoload() 方法,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。
__autoload() 方法接收的一个参数,就是欲加载的类的类名,所以这时候需要类名与文件名对应,如 Person.php ,对应的类名就是 Pserson 。
下面看个完整的实例
class ClassA{ 
public function __construct(){ 
echo “ClassA load success!”; 
} 
} 
//定义一个类ClassA,文件名为ClassA.php 
class ClassA{ 
public function __construct(){ 
echo “ClassA load success!”; 
} 
} 
class ClassB extends ClassA { 
public function __construct(){ 
//parent::__construct(); 
echo “ClassB load success!”; 
} 
} 
//定义一个类ClassB,文件名为ClassB.php,ClassB继承ClassA 
class ClassB extends ClassA { 
public function __construct(){ 
//parent::__construct(); 
echo “ClassB load success!”; 
} 
}

定义两个测试用的类之后,我们来编写一个含有__autoload()方法的PHP运行程序文件如下:
function __autoload($classname){ 
$classpath=”./”.$classname.'.php'; 
if(file_exists($classpath)){ 
require_once($classpath); 
} 
else{ 
echo ‘class file'.$classpath.'not found!'; 
} 
} 
$newobj = new ClassA(); 
$newobj = new ClassB();
PHP 相关文章推荐
MySql中正则表达式的使用方法描述
Jul 30 PHP
PHP 程序授权验证开发思路
Jul 09 PHP
上传文件先创建目录 再上传到目录里面去
Dec 29 PHP
PHP的变量总结 新手推荐
Apr 18 PHP
apache+php完美解决301重定向的两种方法
Jun 08 PHP
php通过COM类调用组件的实现代码
Jan 11 PHP
php json与xml序列化/反序列化
Oct 28 PHP
PHP模板引擎Smarty自定义变量调解器用法
Apr 11 PHP
php parse_str() 函数的定义和用法
May 23 PHP
浅谈PHP中关于foreach使用引用变量的坑
Nov 14 PHP
PHP单例模式详解及实例代码
Dec 21 PHP
laravel添加前台跳转成功页面示例
Oct 22 PHP
php 文本文件的读取效率
Feb 10 #PHP
php+iframe实现隐藏无刷新上传文件
Feb 10 #PHP
PHP中集成PayPal标准支付的实现方法分享
Feb 06 #PHP
PHP中call_user_func_array()函数的用法演示
Feb 05 #PHP
PHP高级对象构建 多个构造函数的使用
Feb 05 #PHP
PHP高级对象构建 工厂模式的使用
Feb 05 #PHP
PHP备份数据库生成SQL文件并下载的函数代码
Feb 05 #PHP
You might like
解析php mysql 事务处理回滚操作(附实例)
2013/08/05 PHP
PHP判断密码强度的方法详解
2017/05/26 PHP
php引用和拷贝的区别知识点总结
2019/09/23 PHP
javascript里的条件判断
2007/02/27 Javascript
javascript复制粘贴与clipboardData的使用
2014/10/16 Javascript
JS实现模拟百度搜索“2012世界末日”网页地震撕裂效果代码
2015/10/31 Javascript
深入解析JavaScript编程中的this关键字使用
2015/11/09 Javascript
基于jQuery实现手风琴菜单、层级菜单、置顶菜单、无缝滚动效果
2017/07/20 jQuery
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
基于Vue+element-ui 的Table二次封装的实现
2018/07/20 Javascript
详解nuxt路由鉴权(express模板)
2018/11/21 Javascript
JavaScript时间日期操作实例小结【5个示例】
2018/12/22 Javascript
Vue图片浏览组件v-viewer用法分析【支持旋转、缩放、翻转等操作】
2019/11/04 Javascript
JS实现多选框的操作
2020/06/24 Javascript
浅谈javascript事件环微任务和宏任务队列原理
2020/09/12 Javascript
vue 自定指令生成uuid滚动监听达到tab表格吸顶效果的代码
2020/09/16 Javascript
深入理解Python中的元类(metaclass)
2015/02/14 Python
python清除指定目录内所有文件中script的方法
2015/06/30 Python
Python获取央视节目单的实现代码
2015/07/25 Python
Python图形绘制操作之正弦曲线实现方法分析
2017/12/25 Python
对django中render()与render_to_response()的区别详解
2018/10/16 Python
在Pycharm terminal中字体大小设置的方法
2019/01/16 Python
Pytorch Tensor基本数学运算详解
2019/12/30 Python
对Python中 \r, \n, \r\n的彻底理解
2020/03/06 Python
Python实现删除某列中含有空值的行的示例代码
2020/07/20 Python
3D动画《斗罗大陆》上线当日播放过亿
2021/03/16 国漫
万宝龙英国官网:Montblanc手表、书写工具、皮革和珠宝
2018/10/16 全球购物
电力公司个人求职信范文
2014/02/04 职场文书
护士试用期自我鉴定
2014/02/08 职场文书
人力管理专业毕业生求职信
2014/02/27 职场文书
产品设计开发计划书
2014/05/07 职场文书
新闻工作者先进事迹
2014/05/26 职场文书
单位工资证明范本
2015/06/12 职场文书
2019年自助餐厅创业计划书模板
2019/08/22 职场文书
详解Python生成器和基于生成器的协程
2021/06/03 Python
oracle重置序列从0开始递增1
2022/02/28 Oracle