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 相关文章推荐
asp和php下textarea提交大量数据发生丢失的解决方法
Jan 20 PHP
PHP 多维数组排序实现代码
Aug 05 PHP
php代码收集表单内容并写入文件的代码
Jan 29 PHP
phplot生成图片类用法详解
Jan 06 PHP
PHP 正则表达式小结
Feb 12 PHP
PHP实现阳历到农历转换的类实例
Mar 07 PHP
列举PHP的Yii 2框架的开发优势
Jul 03 PHP
Laravel实现构造函数自动依赖注入的方法
Mar 16 PHP
Linux环境下php实现给网站截图的方法
May 03 PHP
PHP API接口必备之输出json格式数据示例代码
Jun 27 PHP
ThinkPHP 3.2.3实现页面静态化功能的方法详解
Aug 03 PHP
PHP 中魔术常量的实例详解
Oct 26 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中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
2011/08/23 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
2014/06/30 PHP
递归实现php数组转xml的代码分享
2015/05/14 PHP
网页里控制图片大小的相关代码
2006/06/13 Javascript
JS获取鼠标坐标的实例方法
2013/07/18 Javascript
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
2013/12/19 Javascript
jquery的ajax和getJson跨域获取json数据的实现方法
2014/02/04 Javascript
js实现对table动态添加、删除和更新的方法
2015/02/10 Javascript
Angular发布1.5正式版,专注于向Angular 2的过渡
2016/02/18 Javascript
js获取鼠标点击的对象,点击另一个按钮删除该对象的实现代码
2016/05/13 Javascript
JavaScript通过HTML的class来获取HTML元素的方法总结
2016/05/24 Javascript
详解js中call与apply关键字的作用
2016/11/21 Javascript
AngularJS开发教程之控制器之间的通信方法分析
2016/12/25 Javascript
全面解析vue中的数据双向绑定
2017/05/10 Javascript
JS原生带小白点轮播图实例讲解
2017/07/22 Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
2017/12/11 jQuery
解决vue2.0动态绑定图片src属性值初始化时报错的问题
2018/03/14 Javascript
教你如何用node连接redis的示例代码
2018/07/12 Javascript
elementUI vue this.$confirm 和el-dialog 弹出框 移动 示例demo
2019/07/03 Javascript
微信小程序bindtap事件与冒泡阻止详解
2019/08/08 Javascript
webpack 如何解析代码模块路径的实现
2019/09/04 Javascript
[03:14]辉夜杯主赛事 12月25日每日之星
2015/12/26 DOTA
PyQt5每天必学之组合框
2018/04/20 Python
Python操作word常见方法示例【win32com与docx模块】
2018/07/17 Python
Python制作简单的剪刀石头布游戏
2020/12/10 Python
英国文具、办公用品和科技商店:Ryman
2018/09/27 全球购物
英国领先的在线高尔夫商店:Scottsdale Golf
2019/08/26 全球购物
如果NULL定义成#define NULL((char *)0)难道不就可以向函数传入不加转换的NULL了吗
2012/02/15 面试题
你对IPv6了解程度
2016/02/09 面试题
《动手做做看》教学反思
2014/04/09 职场文书
镇创先争优活动总结
2014/08/28 职场文书
公司股东合作协议书
2014/09/14 职场文书
员工表扬信怎么写
2015/05/05 职场文书
怎样评估创业计划书是否有可行性?
2019/08/07 职场文书
使用css样式设计一个简单的html登陆界面的实现
2021/03/30 HTML / CSS
《原神》新角色演示“神里绫人:林隐泓洄” 宠妹狂魔
2022/04/03 其他游戏