PHP 自动加载类原理与用法实例分析


Posted in PHP onApril 14, 2020

本文实例讲述了PHP 自动加载类原理与用法。分享给大家供大家参考,具体如下:

类的自动加载 (Autoloading Classes)

在编写面向对象(OOP) 程序时,很多开发者为每个类新建一个 PHP 文件。 这会带来一个烦恼:每个脚本的开头,都需要包含(include)一个长长的列表(每个类都有个文件)。

在 PHP 5 中,已经不再需要这样了。 spl_autoload_register() 函数可以注册任意数量的自动加载器,当使用尚未被定义的类(class)和接口(interface)时自动去加载。通过注册自动加载器,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。

Tip

尽管 __autoload() 函数也能自动加载类和接口,但更建议使用 spl_autoload_register() 函数。spl_autoload_register() 提供了一种更加灵活的方式来实现类的自动加载(同一个应用中,可以支持任意数量的加载器,比如第三方库中的)。因此,不再建议使用 __autoload() 函数,在以后的版本中它可能被弃用。

Note:

在 PHP 5.3 之前,__autoload 函数抛出的异常不能被 catch 语句块捕获并会导致一个致命错误(Fatal Error)。 自 PHP 5.3 起,能够 thrown 自定义的异常(Exception),随后自定义异常类即可使用。 __autoload 函数可以递归的自动加载自定义异常类。

Note:

自动加载不可用于 PHP 的 CLI 交互模式。

Note:

如果类名比如被用于 call_user_func(),则它可能包含一些危险的字符,比如 ../。 建议您在这样的函数中不要使用用户的输入,起码需要在 __autoload() 时验证下输入。

自动加载示例

ClassInterface.php

<?php
interface ClassInterface {
  public function print();
  public function get_current_time();
}

MyClass1.php

<?php
class MyClass1 implements ClassInterface
{
  public $flag = 'MyClass1';

  public function print() {
    echo $this->flag;
  }

  public function get_current_time() {
    echo $this->flag . " : " . date("Y-m-d H:i:s",time());
  }
  
}

MyClass2.php

<?php
class MyClass2 implements ClassInterface
{
  public $flag = 'MyClass2';

  public function print() {
    echo "MyClass2";
  }

  public function get_current_time() {
    echo $this->flag . " : " . date("Y-m-d H:i:s",time());
  }
  
}

autoload.php

<?php
date_default_timezone_set('Asia/Shanghai');
spl_autoload_register(function ($class_name) {
  require_once $class_name . '.php';
});

$obj = new MyClass1();
$obj2 = new MyClass2();
$obj->print();
echo "<br>";
$obj->get_current_time();
echo "<br>";
$obj2->print();
echo "<br>";
$obj2->get_current_time();

 输出结果:

PHP 自动加载类原理与用法实例分析

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
消息持续发送的完整例子
Oct 09 PHP
php生成EXCEL的东东
Oct 09 PHP
延长phpmyadmin登录时间的方法
Feb 06 PHP
PHP中实现中文字符进制转换原理分析
Dec 06 PHP
谈谈关于php的优点与缺点
Apr 11 PHP
深入PHP与浏览器缓存的分析
Jun 03 PHP
深入eAccelerator与memcached的区别详解
Jun 06 PHP
php中OR与|| AND与&amp;&amp;的区别总结
Oct 26 PHP
php数组去重复数据示例
Feb 25 PHP
yii的入口文件index.php中为什么会有这两句
Aug 04 PHP
PHP实现负载均衡的加权轮询方法分析
Aug 22 PHP
PHP chunk_split()函数讲解
Feb 12 PHP
php操作redis常见方法示例【key与value操作】
Apr 14 #PHP
PHPExcel实现的读取多工作表操作示例
Apr 14 #PHP
ThinkPHP 框架实现的读取excel导入数据库操作示例
Apr 14 #PHP
PHP 面向对象程序设计之类属性与类常量实现方法分析
Apr 13 #PHP
PHP 对象接口简单实现方法示例
Apr 13 #PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
Apr 13 #PHP
yii2.0框架多模型操作示例【添加/修改/删除】
Apr 13 #PHP
You might like
PHP二维数组排序的3种方法和自定义函数分享
2014/04/09 PHP
PHP中的数组处理函数实例总结
2016/01/09 PHP
thinkphp分页集成实例
2017/07/24 PHP
Jquery操作Select 简单方便 一个js插件搞定
2009/11/12 Javascript
利用谷歌地图API获取点与点的距离的js代码
2012/10/11 Javascript
JS判断不同分辨率调用不同的CSS样式文件实现思路及测试代码
2013/01/23 Javascript
Knockout visible绑定使用方法
2013/11/15 Javascript
js对文章内容进行分页示例代码
2014/03/05 Javascript
Node.js实现在目录中查找某个字符串及所在文件
2014/09/03 Javascript
JavaScript实现16进制颜色值转RGB的方法
2015/02/09 Javascript
JavaScript动态创建div等元素实例讲解
2016/01/06 Javascript
js与jquery正则验证电子邮箱、手机号、邮政编码的方法
2016/07/04 Javascript
jQuery对table表格进行增删改查
2020/12/22 Javascript
node.js连接MongoDB数据库的2种方法教程
2017/05/17 Javascript
基于vue的换肤功能的示例代码
2017/10/10 Javascript
教你如何用node连接redis的示例代码
2018/07/12 Javascript
详解微信小程序用定时器实现倒计时效果
2019/04/30 Javascript
JavaScript实现PC端横向轮播图
2020/02/07 Javascript
python实现根据主机名字获得所有ip地址的方法
2015/06/28 Python
Python 序列的方法总结
2016/10/18 Python
pytorch中tensor的合并与截取方法
2018/07/26 Python
对python制作自己的数据集实例讲解
2018/12/12 Python
在Python中使用filter去除列表中值为假及空字符串的例子
2019/11/18 Python
Python线程指南分享
2019/11/19 Python
Python reduce函数作用及实例解析
2020/05/08 Python
python实现图书馆抢座(自动预约)功能的示例代码
2020/09/29 Python
python 实现简单的计算器(gui界面)
2020/11/11 Python
基于Html5 canvas实现裁剪图片和马赛克功能及又拍云上传图片 功能
2019/07/09 HTML / CSS
美国家具网站:Cymax
2016/09/17 全球购物
大三自我鉴定范文
2013/10/05 职场文书
小学教育毕业生自荐信
2013/11/18 职场文书
大学总结自我鉴定
2014/01/18 职场文书
关于清明节的演讲稿
2014/09/13 职场文书
拾金不昧表扬信
2015/01/16 职场文书
2016年领导干部正风肃纪心得体会
2015/10/09 职场文书
Mysql Innodb存储引擎之索引与算法
2022/02/15 MySQL