PHP中__autoload()与spl_autoload_register()函数的用法与区别
_autoload() 函数在PHP文档中的解释是试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。
如何理解这句话,我们首先看下面一个简单的例子:
首先定义ClassA和ClassB两个类,其中ClassB继承ClassA。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?php //定义一个类ClassA,文件名为ClassA.phpclass ClassA{ public function __construct(){ echo "ClassA load success!"; }} //定义一个类ClassB,文件名为ClassB.php,ClassB继承ClassAclass ClassB extends ClassA { public function __construct(){ //parent::__construct(); echo "ClassB load success!"; }}?> |
下面我们使用__autoload()加载这两个类:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<?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();?> |
上面代码输出:
ClassA load success!
ClassB load success!
说明当我们实例化一个类是自动调用__autoload()函数
用这种方法加载类是不是很简单呢,但是这里需要注意以下几点:
1、如果类存在继承关系,那么继承者和被继承者要在同一个目录下。
2、使用__autoload函数时,类名和类的文件名必须一致。
3、在CLI模式下运行PHP脚本的话这个方法无效
当我们开发大型应用程序时,会有很多类需要加载,此时如果再使用__autoload()函数来加载的话程序就会显得很臃肿。大家在阅读PHP手册关于__autoload()函数时可能会注意到有这样一句话:spl_autoload_register() 提供了一种更加灵活的方式来实现类的自动加载。因此,不再建议使用 __autoload() 函数,在以后的版本中它可能被弃用。下面我们看看spl_autoload_register()有哪些优势。
官方手册对spl_autoload_register()函数是这样解释的: 注册__autoload()函数。
这样很难理解,下面我们看一个实例:
|
1
2
3
4
5
6
7
8
9
10
11
|
<?phpfunction loadprint( $class ) { $file = $class . '.class.php'; if (is_file($file)) { require_once($file); }}spl_autoload_register( 'loadprint' );$obj = new PRINTIT();$obj->doPrint();?> |
在代码中我们将__autoload替换成loadprint,此时loadprint()函数不会自动调用,这时spl_autoload_register()就起作用了,它告诉PHP碰到没有定义的类就执行loadprint()。
因此,当我们不想自动加载的时候调用__autoload,而是调用我们自己的函数(或者类方法),我们可以使用spl_autoload_register来注册我们自己的autoload函数。
PHP中__autoload()与spl_autoload_register()函数的用法与区别的更多相关文章
- PHP中spl_autoload_register()函数的用法
spl_autoload_register (PHP 5 >= 5.1.2) spl_autoload_register — 注册__autoload()函数 说明 bool spl_autol ...
- PHP中spl_autoload_register函数的用法
spl_autoload_register (PHP 5 >= 5.1.2) spl_autoload_register — 注册__autoload()函数 说明bool spl_autolo ...
- 自动加载类PHP中spl_autoload_register函数的用法
spl_autoload_register(PHP 5 >= 5.1.2) spl_autoload_register — 注册__autoload()函数 说明bool spl_autoloa ...
- HP中spl_autoload_register函数的用法
spl_autoload_register(PHP 5 >= 5.1.2) spl_autoload_register - 注册__autoload()函数 说明bool spl_autoloa ...
- Calendar中add函数和roll函数的用法及区别
Calendar中add()和roll()函数的用法一.取某个时间点后的整点时刻.例如1984年7月7日15:23:05后的整点时刻即为1984-07-07 16:00:00.实现如下:Calenda ...
- C++中rand()函数的用法
C++中rand()函数的用法 2011-12-30 11:03:59| 分类: C / C++|举报|字号 订阅 一.C++中不能使用random()函数 random函数不是ANSI C标准 ...
- MATLAB中“repmat”与“cat”函数的用法
MATLAB中“repmat”与“cat”函数的用法 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. repmat函数 >> z=re ...
- Pytorch中randn和rand函数的用法
Pytorch中randn和rand函数的用法 randn torch.randn(*sizes, out=None) → Tensor 返回一个包含了从标准正态分布中抽取的一组随机数的张量 size ...
- SQL语句中count(1)count(*)count(字段)用法的区别
SQL语句中count(1)count(*)count(字段)用法的区别 在SQL语句中count函数是最常用的函数之一,count函数是用来统计表中记录数的一个函数, 一. count(1)和cou ...
随机推荐
- [WIFI] WIFI 破解(初级)
话不多说,先来看看字典破解 wpa2 的效果 =================================== ========================================= ...
- Android DatepickerDialog(日期选择器)的使用
效果图如下: 日期和时间选择对话框,首先是要获得当前时间,这里用 java类中的Calendar来获得日期和时间(也可以用Date,但是不提倡,Date部分方法已经注释为过时), Calendar是一 ...
- 02.JMS基础
1.面向消息的中间件(MOM) 1.什么是MOM 面向消息的中间件,Message Oriented Middleware,简称MOM,中文简称消息中间件,利用高效可靠的消息传递机制进行平台无 ...
- Docker企业级仓库Harbor的安装配置与使用
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全.标识和管理等,扩展了开源Docker Distribution.作为一个企业级 ...
- Haskell中cabal install glib遇到的问题
1. 运行命令cabal install glib时出现错误: Cannot find gtk2hsC2hs Please install `gtk2hs-buildtools` first and ...
- 导出Excel过程中遇到的问题java.lang.NoClassDefFoundError: org/apache/xmlbeans/XmlException
尝试实现java导出功能时遇到如下报错: org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.No ...
- Python开发【模块】:Requests(一)
Requests模块 1.模块说明 Requests 是使用 Apache2 Licensed 许可证的 HTTP 库.用 Python 编写,真正的为人类着想. Python 标准库中的 urlli ...
- Nginx 使用总结
一.使用 nginx 实现 灰度发布 灰度发布,现在是很多大项目的一个标配运维特性,我们可以将一个“新的版本代码”发布到集群中的少数几台(组)机器上,以便引入线上少量真实用 户进行测试,用于验证产品改 ...
- SELINUX导致数据修改权限不成功
SELINUX导致数据修改权限不成功基本概念参考:https://blog.csdn.net/yanjun821126/article/details/80828908 查看SELinux状态: ./ ...
- (转) SpringBoot非官方教程 | 第十一篇:springboot集成swagger2,构建优雅的Restful API
swagger,中文“拽”的意思.它是一个功能强大的api框架,它的集成非常简单,不仅提供了在线文档的查阅,而且还提供了在线文档的测试.另外swagger很容易构建restful风格的api,简单优雅 ...