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 相关文章推荐
Apache, PHP在Windows 9x/NT下的安装与配置 (一)
Oct 09 PHP
使用PHP 5.0创建图形的巧妙方法
Oct 12 PHP
php获取当前时间的毫秒数的方法
Jan 26 PHP
php跨站攻击实例分析
Oct 28 PHP
php实现的css文件背景图片下载器代码
Nov 11 PHP
PHP数组相关函数汇总
Mar 24 PHP
Zend Framework教程之动作的基类Zend_Controller_Action详解
Mar 07 PHP
/etc/php-fpm.d/www.conf 配置注意事项
Feb 04 PHP
thinkPHP5项目中实现QQ第三方登录功能
Oct 20 PHP
PHP APP微信提现接口代码
Sep 30 PHP
php中如何执行linux命令详解
Nov 06 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
Feb 15 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
自动分页的不完整解决方案
2007/01/12 PHP
生成卡号php代码
2008/04/09 PHP
三个类概括PHP的五种设计模式
2012/09/05 PHP
基于php上传图片重命名的6种解决方法的详细介绍
2013/04/28 PHP
VB中的RasEnumConnections函数返回632错误解决方法
2014/07/29 PHP
通过php删除xml文档内容的方法
2015/01/23 PHP
Laravel 5框架学习之Eloquent (laravel 的ORM)
2015/04/08 PHP
PHP利用Socket获取网站的SSL证书与公钥
2017/06/18 PHP
Javascript Global对象
2009/08/13 Javascript
extjs实现选择多表自定义查询功能 前台部分(ext源码)
2011/12/20 Javascript
jquery怎样实现ajax联动框(二)
2013/03/08 Javascript
jquery滚动条插件jScrollPane的使用介绍
2013/11/08 Javascript
js中一个函数获取另一个函数返回值问题探讨
2013/11/21 Javascript
js获取页面传来参数的方法
2014/09/06 Javascript
详解JavaScript编程中的数组结构
2015/10/24 Javascript
Node.js重新刷新session过期时间的方法
2016/02/04 Javascript
Node.js的环境安装配置(使用nvm方式)
2016/10/11 Javascript
jQuery插件扩展实例【添加回调函数】
2016/11/26 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
2016/12/08 Javascript
JS实现简单的二元方程计算器功能示例
2017/01/03 Javascript
详解AngularJs ui-router 路由的简单介绍
2017/04/26 Javascript
JavaScript实现简单的文本逐字打印效果示例
2018/04/12 Javascript
微信小程序缓存过期时间的使用详情
2019/05/12 Javascript
vue 如何从单页应用改造成多页应用
2020/10/23 Javascript
Python入门之三角函数atan2()函数详解
2017/11/08 Python
快速入门python学习笔记
2017/12/06 Python
ubuntu安装mysql pycharm sublime
2018/02/20 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
2019/07/11 Python
Python爬虫:将headers请求头字符串转为字典的方法
2019/08/21 Python
详解Python调用系统命令的六种方法
2021/01/28 Python
美国最大的宠物药店:1-800-PetMeds
2016/10/02 全球购物
中国跨镜手机配件批发在线商店:TVC-Mall
2019/08/20 全球购物
MAC彩妆澳洲官网:M·A·C AU
2021/01/17 全球购物
咖啡蛋糕店创业计划书
2014/01/28 职场文书
安康杯竞赛活动总结
2014/05/05 职场文书
幼儿园秋季开学通知
2015/07/16 职场文书