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 相关文章推荐
Win9x/ME下Apache+PHP安装配置
Oct 09 PHP
判断php数组是否为索引数组的实现方法
Jun 13 PHP
destoon实现底部添加你是第几位访问者的方法
Jul 15 PHP
ThinkPHP 3.2 数据分页代码分享
Oct 14 PHP
php常用字符串处理函数实例分析
Nov 22 PHP
Codeigniter购物车类不能添加中文的解决方法
Nov 29 PHP
PHP 正则表达式小结
Feb 12 PHP
php结合ACCESS的跨库查询功能
Jun 12 PHP
PHP内核学习教程之php opcode内核实现
Jan 27 PHP
Symfony2安装的方法(2种方法)
Feb 04 PHP
深入理解php printf() 输出格式化的字符串
May 23 PHP
php nginx 实时输出的简单实现方法
Jan 21 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常用image图像函数集
2013/06/24 PHP
php实现aes加密类分享
2014/02/16 PHP
修改ThinkPHP缓存为Memcache的方法
2014/06/25 PHP
PHP抓取网页、解析HTML常用的方法总结
2015/07/01 PHP
php+html5+ajax实现上传图片的方法
2016/05/14 PHP
详解new function(){}和function(){}() 区别分析
2008/03/22 Javascript
再论Javascript下字符串连接的性能
2011/03/05 Javascript
Ajax异步提交表单数据的说明及方法实例
2013/06/22 Javascript
javascript打印输出json实例
2013/11/11 Javascript
javascript定义变量时加var与不加var的区别
2014/12/22 Javascript
js Calender控件使用详解
2015/01/05 Javascript
Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
纯jquery实现模仿淘宝购物车结算
2015/08/20 Javascript
JS打字效果的动态菜单代码分享
2015/08/21 Javascript
vue2.x select2 指令封装详解
2017/10/12 Javascript
浅谈es6 javascript的map数据结构
2017/12/14 Javascript
vue-cli实现多页面多路由的示例代码
2018/01/30 Javascript
node微信开发之获取access_token+自定义菜单
2019/03/17 Javascript
js判断鼠标移入移出方向的方法
2020/06/24 Javascript
Python自动化测试ConfigParser模块读写配置文件
2016/08/15 Python
Java编程迭代地删除文件夹及其下的所有文件实例
2018/02/10 Python
TensorFlow Session使用的两种方法小结
2018/07/30 Python
详解django2中关于时间处理策略
2019/03/06 Python
Pycharm的Available Packages为空的解决方法
2020/09/18 Python
Numpy ndarray 多维数组对象的使用
2021/02/10 Python
Pytorch如何切换 cpu和gpu的使用详解
2021/03/01 Python
英国天然保健品网站:Simply Supplements
2017/03/22 全球购物
英国旅行箱包和行李箱购物网站:Travel Luggage & Cabin Bags
2019/08/26 全球购物
Otiumberg官网:英国半精致珠宝品牌
2021/01/16 全球购物
简历自我评价怎么写好呢?
2014/01/04 职场文书
高中打架检讨书
2014/02/13 职场文书
工程部岗位职责
2015/02/10 职场文书
2015小学毕业班工作总结
2015/07/21 职场文书
正确使用MySQL INSERT INTO语句
2021/05/26 MySQL
Mysql排序的特性详情
2021/11/01 MySQL
微信小程序结合ThinkPHP5授权登陆后获取手机号
2021/11/23 PHP