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)
Sep 04 PHP
php session劫持和防范的方法
Nov 12 PHP
php socket客户端及服务器端应用实例
Jul 04 PHP
PHP配置把错误日志以邮件方式发送方法(Windows系统)
Jun 23 PHP
浅析PHP关键词替换的类(避免重复替换,保留与还原原始链接)
Sep 22 PHP
PHP面试题之文件目录操作
Oct 15 PHP
PHP新建类问题分析及解决思路
Nov 19 PHP
深入理解PHP JSON数组与对象
Jul 19 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
Oct 14 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
Sep 15 PHP
PHP7中I/O模型内核剖析详解
Apr 14 PHP
Laravel 登录后清空COOKIE的操作方法
Oct 14 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中使用addslashes函数报错问题的解决方法
2013/02/06 PHP
php 判断是否是中文/英文/数字示例代码
2013/09/30 PHP
PHP进程通信基础之信号量与共享内存通信
2017/02/19 PHP
Laravel使用swoole实现websocket主动消息推送的方法介绍
2019/10/20 PHP
Laravel 5+ .env环境配置文件详解
2020/04/06 PHP
Javascript中的变量使用说明
2010/05/18 Javascript
jquery下json数组的操作实现代码
2010/08/09 Javascript
jQuery中fadeOut()方法用法实例
2014/12/24 Javascript
JS实现的页面自定义滚动条效果
2015/10/26 Javascript
JavaScript中Window对象的属性及事件
2015/12/25 Javascript
基于Echarts 3.19 制作常用的图形(非静态)
2016/05/19 Javascript
Bootstrap开发实战之第一次接触Bootstrap
2016/06/02 Javascript
jquery+CSS3实现3D拖拽相册效果
2016/07/18 Javascript
jQuery实现的小图列表,大图展示效果幻灯片示例
2016/10/25 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
2016/10/26 Javascript
详解Nodejs的timers模块
2016/12/22 NodeJs
vue 页面加载进度条组件实例
2018/02/05 Javascript
Javascript实现运算符重载详解
2018/04/07 Javascript
javascript 原型与原型链的理解及实例分析
2019/11/23 Javascript
云服务器部署Node.js项目的方法步骤(小白系列)
2020/03/23 Javascript
Python实现windows下模拟按键和鼠标点击的方法
2015/03/13 Python
Python的Twisted框架上手前所必须了解的异步编程思想
2016/05/25 Python
Python在信息学竞赛中的运用及Python的基本用法(详解)
2017/08/15 Python
pygame实现俄罗斯方块游戏(对战篇1)
2019/10/29 Python
Python类成员继承重写的实现
2020/09/16 Python
selenium携带cookies模拟登陆CSDN的实现
2021/01/19 Python
波兰品牌鞋履在线商店:Eastend.pl
2020/01/11 全球购物
华为python面试题
2016/05/03 面试题
精选干货:Java精选笔试题附答案
2014/01/18 面试题
家长学校培训材料
2014/08/20 职场文书
镇党委书记群众路线整改措施思想汇报
2014/10/13 职场文书
大学生实习推荐信
2015/03/27 职场文书
2015年教师师德师风承诺书
2015/04/28 职场文书
人事任命书范本
2015/09/21 职场文书
如何撰写出一份完美的商业计划书?
2019/07/12 职场文书
MySQL提升大量数据查询效率的优化神器
2022/07/07 MySQL