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新手上路(十)
Oct 09 PHP
PHP 图像尺寸调整代码
May 26 PHP
PHP静态调用非静态方法的应用分析
May 02 PHP
PHP将XML转数组过程详解
Nov 13 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
Dec 20 PHP
php无限极分类递归排序实现方法
Nov 11 PHP
typecho插件编写教程(二):写一个新插件
May 28 PHP
php实现分页显示
Nov 03 PHP
PHP实现文件上传与下载实例与总结
Mar 13 PHP
php $_SESSION会员登录实例分享
Jan 19 PHP
PHP获取数组中单列值的方法
Jun 10 PHP
详解PHP字符串替换str_replace()函数四种用法
Oct 13 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
上海无线电三厂简史修改版
2021/03/01 无线电
PHP中模拟处理HTTP PUT请求的例子
2014/07/22 PHP
php导入excel文件到mysql数据库的方法
2015/01/14 PHP
php使用Session和文件统计在线人数
2015/07/04 PHP
js 对联广告、漂浮广告封装类(IE,FF,Opera,Safari,Chrome
2009/11/26 Javascript
jquery实现每个数字上都带进度条的幻灯片
2013/02/20 Javascript
jQuery判断checkbox是否选中的小例子
2013/12/02 Javascript
javascript数组操作总结和属性、方法介绍
2014/04/05 Javascript
简介JavaScript中的push()方法的使用
2015/06/09 Javascript
Angular2+国际化方案(ngx-translate)的示例代码
2017/08/23 Javascript
html中通过JS获取JSON数据并加载的方法
2017/11/30 Javascript
jQuery实现网页拼图游戏
2020/04/22 jQuery
详解vue-cli 2.0配置文件(小结)
2019/01/14 Javascript
JS实现选项卡效果的代码实例
2019/05/20 Javascript
layui实现下拉复选功能的例子(包括数据的回显与上传)
2019/09/24 Javascript
JavaScript中变量提升机制示例详解
2019/12/27 Javascript
vue 封装面包屑组件教程
2020/11/16 Javascript
[09:37]2018DOTA2国际邀请赛寻真——不懈追梦的Team Serenity
2018/08/13 DOTA
[36:09]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
Django查找网站项目根目录和对正则表达式的支持
2015/07/15 Python
Python中顺序表的实现简单代码分享
2018/01/09 Python
Python使用Turtle库绘制一棵西兰花
2019/11/23 Python
keras K.function获取某层的输出操作
2020/06/29 Python
浅析canvas元素的html尺寸和css尺寸对元素视觉的影响
2019/07/22 HTML / CSS
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
大学信息公开实施方案
2014/03/09 职场文书
工程承诺书怎么写
2014/05/24 职场文书
医院领导班子查摆问题对照检查材料思想汇报
2014/10/08 职场文书
2014年幼儿园后勤工作总结
2014/11/10 职场文书
个人典型事迹材料
2014/12/30 职场文书
教师个人师德总结
2015/02/06 职场文书
2015年教师党员承诺书
2015/04/27 职场文书
拾金不昧表扬稿大全
2015/05/05 职场文书
2015团员个人年度总结
2015/11/24 职场文书
教师素质教育心得体会
2016/01/19 职场文书
Python编写车票订购系统 Python实现快递收费系统
2022/08/14 Python