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 相关文章推荐
[转帖]PHP世纪万年历
Dec 06 PHP
又一个php 分页类实现代码
Dec 03 PHP
PHP print类函数使用总结
Jun 25 PHP
一个PHP缓存类代码(附详细说明)
Jun 09 PHP
简单的php写入数据库类代码分享
Jul 26 PHP
超小PHP小马小结(方便查找后门的朋友)
May 05 PHP
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
Jan 19 PHP
解析php中session的实现原理以及大网站应用应注意的问题
Jun 17 PHP
destoon首页调用求购供应信息的地区名称的方法
Aug 21 PHP
PHP-Java-Bridge使用笔记
Sep 22 PHP
ThinkPHP分组下自定义标签库实例
Nov 01 PHP
PHP7扩展开发之hello word实现方法详解
Jan 15 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与XML联手进行网站编程代码实例
2008/07/10 PHP
PHP实现的多彩标签效果代码分享
2014/08/21 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
2015/08/21 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
2019/10/17 PHP
js创建对象的方式总结
2015/01/10 Javascript
简介JavaScript中的unshift()方法的使用
2015/06/09 Javascript
JavaScript实现网站访问次数统计代码
2015/08/12 Javascript
点击按钮出现60秒倒计时的简单js代码(推荐)
2016/06/07 Javascript
vue双向绑定的简单实现
2016/12/22 Javascript
JS实现的全排列组合算法示例
2017/10/09 Javascript
Vue入门之数据绑定(小结)
2018/01/08 Javascript
JS监听事件的叠加和移除功能
2018/11/19 Javascript
JS数组及对象遍历方法代码汇总
2020/06/16 Javascript
如何在Express4.x中愉快地使用async的方法
2020/11/18 Javascript
使用python实现rsa算法代码
2016/02/17 Python
Python编程之序列操作实例详解
2017/07/22 Python
pycharm远程调试openstack代码
2017/11/21 Python
关于pymysql模块的使用以及代码详解
2019/09/01 Python
python 实现图片上传接口开发 并生成可以访问的图片url
2019/12/18 Python
python读取tif图片时保留其16bit的编码格式实例
2020/01/13 Python
Python GUI库PyQt5样式QSS子控件介绍
2020/02/25 Python
Python3获取cookie常用三种方案
2020/10/05 Python
Matplotlib animation模块实现动态图
2021/02/25 Python
css3发光搜索表单分享
2014/04/11 HTML / CSS
5 个强大的HTML5 API 函数推荐
2014/11/19 HTML / CSS
如果一个类实现了多个接口但是这些接口有相同的方法名将会怎样
2013/06/16 面试题
口腔医学技术应届生求职信
2013/11/09 职场文书
群众路线教育实践活动的心得体会
2014/09/03 职场文书
校运动会广播稿(100篇)
2014/09/12 职场文书
副检察长四风问题对照检查材料思想汇报
2014/10/07 职场文书
校园安全主题班会
2015/08/12 职场文书
法制主题班会教案
2015/08/13 职场文书
2019年二手房买卖合同范本
2019/10/14 职场文书
微信小程序实现聊天室功能
2021/06/14 Javascript
Node-Red实现MySQL数据库连接的方法
2021/08/07 MySQL
Vue Element plus使用方法梳理
2022/12/24 Vue.js