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 相关文章推荐
一个SQL管理员的web接口
Oct 09 PHP
php数组应用之比较两个时间的相减排序
Aug 18 PHP
PHP合并数组+与array_merge的区别分析
Aug 01 PHP
php懒人函数 自动添加数据
Jun 28 PHP
PHP 数据结构 算法描述 冒泡排序 bubble sort
Jul 10 PHP
深入PHP获取随机数字和字母的方法详解
Jun 06 PHP
探讨php中防止SQL注入最好的方法是什么
Jun 10 PHP
php生成静态页面的简单示例
Apr 17 PHP
Thinkphp实现MySQL读写分离操作示例
Jun 25 PHP
PHP限制HTML内容中图片必须是本站的方法
Jun 16 PHP
PHP写API输出的时用echo的原因详解
Apr 28 PHP
php使用pecl方式安装扩展操作示例
Aug 12 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解决约瑟夫环示例
2014/04/09 PHP
php表单提交实例讲解
2015/11/12 PHP
带你了解PHP7 性能翻倍的关键
2015/11/19 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
JavaScript 语言基础知识点总结(思维导图)
2013/11/10 Javascript
js实现仿百度汽车频道选择汽车图片展示实例
2015/05/06 Javascript
jQuery中的ajax async同步和异步详解
2015/09/29 Javascript
JS实现从顶部下拉显示的带动画QQ客服特效代码
2015/10/24 Javascript
javascript实现延时显示提示框特效代码
2016/04/27 Javascript
JavaScript事件学习小结(一)事件流
2016/06/09 Javascript
微信小程序  wx.request合法域名配置详解
2016/11/23 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
2016/12/21 Javascript
JavaScript实现下拉列表
2021/01/20 Javascript
[35:55]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.11
2020/12/13 DOTA
Python HTMLParser模块解析html获取url实例
2015/04/08 Python
Python中处理时间的几种方法小结
2015/04/09 Python
python结合opencv实现人脸检测与跟踪
2015/06/08 Python
Java多线程编程中ThreadLocal类的用法及深入
2016/06/21 Python
python dict.get()和dict['key']的区别详解
2016/06/30 Python
玩转python selenium鼠标键盘操作(ActionChains)
2020/04/12 Python
Python 实现删除某路径下文件及文件夹的实例讲解
2018/04/24 Python
python操作redis方法总结
2018/06/06 Python
Python找出微信上删除你好友的人脚本写法
2018/11/01 Python
Python为何不支持switch语句原理详解
2020/10/21 Python
CSS3中的@keyframes关键帧动画的选择器绑定
2016/06/13 HTML / CSS
马来西亚银饰品牌:JEOEL
2017/12/15 全球购物
Qoo10台湾站:亚洲领先的在线市场
2018/05/15 全球购物
异步传递消息系统的作用
2016/05/01 面试题
学校经典推荐信
2013/10/30 职场文书
党章培训心得体会
2014/09/04 职场文书
四风查摆问题自查报告
2014/10/10 职场文书
中学生检讨书1000字
2014/10/28 职场文书
2015年世界水日活动总结
2015/02/09 职场文书
2015教师个人工作总结范文
2015/03/31 职场文书
关于观后感的作文
2015/06/18 职场文书
Golang 对es的操作实例
2022/04/20 Golang