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 clearstatcache()函数详解
Mar 02 PHP
PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
Mar 28 PHP
基于Linux调试工具strace与gdb的常用命令总结
Jun 03 PHP
PHP中使用imagick实现把PDF转成图片
Jan 26 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
Aug 21 PHP
php实现爬取和分析知乎用户数据
Jan 26 PHP
php ajax实现文件上传进度条
Mar 29 PHP
Yii配置与使用memcached缓存的方法
Jul 13 PHP
php 开发中加密的几种方法总结
Mar 22 PHP
原生JS实现Ajax通过GET方式与PHP进行交互操作示例
May 12 PHP
Laravel timestamps 设置为unix时间戳的方法
Oct 11 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上传Excel文件导入数据到MySQL数据库示例
2016/10/25 PHP
php array_reverse 以相反的顺序返回数组实例代码
2017/04/11 PHP
jQuery AJAX实现调用页面后台方法和web服务定义的方法分享
2012/03/01 Javascript
浅谈JavaScript 框架分类
2014/11/10 Javascript
JavaScript设计模式之工厂模式和构造器模式
2015/02/11 Javascript
代码分析jQuery四种静态方法使用
2015/07/23 Javascript
javascript实现无法关闭的弹框
2016/11/27 Javascript
js处理层级数据结构的方法小结
2017/01/17 Javascript
详解angularjs利用ui-route异步加载组件
2017/05/21 Javascript
浅谈ES6 模板字符串的具体使用方法
2017/11/07 Javascript
浅谈PDF.js使用心得
2018/06/07 Javascript
在vue中安装使用vux的教程详解
2018/09/16 Javascript
bootstrap-table实现表头固定以及列固定的方法示例
2019/03/07 Javascript
three.js中多线程的使用及性能测试详解
2021/01/07 Javascript
[02:03]风行者至宝清风环佩外观展示
2020/09/05 DOTA
[50:54]完美世界DOTA2联赛 GXR vs IO 第三场 11.07
2020/11/10 DOTA
python 文件操作删除某行的实例
2017/09/04 Python
python实现微信接口(itchat)详细介绍
2017/10/23 Python
Python装饰器模式定义与用法分析
2018/08/06 Python
python项目对接钉钉SDK的实现
2019/07/15 Python
pandas DataFrame 警告(SettingWithCopyWarning)的解决
2019/07/23 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
2019/09/04 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
2020/04/07 Python
python多进程使用函数封装实例
2020/05/02 Python
香港士多网上超级市场:Ztore
2021/01/09 全球购物
介绍一下内联、左联、右联
2013/12/31 面试题
技能比赛获奖感言
2014/02/14 职场文书
人事部岗位职责范本
2014/03/05 职场文书
给校长的一封建议书
2014/03/12 职场文书
导师工作推荐信范文
2014/05/17 职场文书
领导班子四风问题个人对照检查材料
2014/10/04 职场文书
财务稽核岗位职责
2015/04/13 职场文书
河童之夏观后感
2015/06/11 职场文书
关于空气污染危害的感想
2015/08/11 职场文书
基于Nginx实现限制某IP短时间访问次数
2021/03/31 Servers
MySQL修改默认引擎和字符集详情
2021/09/25 MySQL