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 相关文章推荐
两个强悍的php 图像处理类1
Jun 15 PHP
PHP中的integer类型使用分析
Jul 27 PHP
Php Ctemplate引擎开发相关内容
Mar 03 PHP
php简单开启gzip压缩方法(zlib.output_compression)
Apr 13 PHP
php三维数组去重(示例代码)
Nov 26 PHP
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
Apr 29 PHP
百度工程师讲PHP函数的实现原理及性能分析(三)
May 13 PHP
基于PHP实现等比压缩图片大小
Mar 04 PHP
利用php-cli和任务计划实现刷新token功能的方法
May 03 PHP
tp5框架使用composer实现日志记录功能示例
Jan 10 PHP
PHP正则表达式笔记与实例详解
May 09 PHP
PHP中关于php.ini参数优化详解
Feb 28 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下尝试使用GraphicsMagick的缩略图功能
2011/01/01 PHP
ThinkPHP2.0读取MSSQL提示Incorrect syntax near the keyword 'AS'的解决方法
2014/06/25 PHP
本地计算机无法启动Apache故障处理
2014/08/08 PHP
php浏览历史记录的方法
2015/03/10 PHP
菜鸟javascript基础资料整理2
2010/12/06 Javascript
关于jquery append() html时的小问题的解决方法
2010/12/16 Javascript
jQuery焦点图切换简易插件制作过程全纪录
2014/08/27 Javascript
jquery实现叠层3D文字特效代码分享
2015/08/21 Javascript
jQuery筛选数组之grep、each、inArray、map的用法及遍历json对象
2016/06/20 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
2016/06/20 Javascript
深入浅析JavaScript中的3DES
2016/08/24 Javascript
vue.js中v-on:textInput无法执行事件问题的解决过程
2017/07/12 Javascript
从setTimeout看js函数执行过程
2017/12/19 Javascript
通过fastclick源码分析彻底解决tap“点透”
2017/12/24 Javascript
详解element-ui中el-select的默认选择项问题
2019/08/02 Javascript
[00:35]2016完美“圣”典风云人物:冷冷宣传片
2016/12/08 DOTA
Python中处理字符串之islower()方法的使用简介
2015/05/19 Python
Python管理Windows服务小脚本
2018/03/12 Python
python实现数独游戏 java简单实现数独游戏
2018/03/30 Python
django2.0扩展用户字段示例
2019/02/13 Python
django组合搜索实现过程详解(附代码)
2019/08/06 Python
Pytorch释放显存占用方式
2020/01/13 Python
Python ATM功能实现代码实例
2020/03/19 Python
美国半成品食材配送服务商:Home Chef
2018/01/25 全球购物
乌克兰数字设备、配件和智能技术的连锁商店:KTC
2020/08/18 全球购物
《长征》教学反思
2014/04/27 职场文书
运动会方阵口号
2014/06/07 职场文书
贷款委托书怎么写
2014/08/02 职场文书
机械制造专业大学生自我鉴定
2014/09/19 职场文书
村干部四风问题整改措施
2014/09/30 职场文书
期末个人总结范文
2015/02/13 职场文书
公安机关起诉意见书
2015/05/20 职场文书
感恩教育观后感
2015/06/17 职场文书
病房管理制度范本
2015/08/06 职场文书
2015年秋学期师德师风建设工作总结
2015/10/23 职场文书
强烈推荐:小学生:暑假作息时间表(值得收藏)
2019/07/09 职场文书