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与SQL注入攻击防范小技巧
Sep 16 PHP
php函数array_merge用法一例(合并同类数组)
Feb 03 PHP
PHP常用数组函数介绍
Jul 28 PHP
php生成shtml类用法实例
Dec 09 PHP
php匹配字符中链接地址的方法
Dec 22 PHP
php 批量查询搜狗sogou代码分享
May 17 PHP
php精确的统计在线人数的方法
Oct 21 PHP
分享PHP守护进程类
Dec 30 PHP
Laravel SQL语句记录方式(推荐)
May 26 PHP
PHP不使用内置函数实现字符串转整型的方法示例
Jul 03 PHP
PHP工厂模式简单实现方法示例
May 23 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
phpfans留言版用到的install.php
2007/01/04 PHP
php strstr查找字符串中是否包含某些字符的查找函数
2010/06/03 PHP
php+mysqli事务控制实现银行转账实例
2015/01/29 PHP
编写PHP脚本来实现WordPress中评论分页的功能
2015/12/10 PHP
PHP处理CSV表格文件的常用操作方法总结
2016/07/01 PHP
Laravel第三方包报class not found的解决方法
2019/10/13 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
JavaScript聚焦于第一个字段的代码
2010/10/15 Javascript
js单向链表的具体实现实例
2013/06/21 Javascript
js获取input标签的输入值实现代码
2013/08/05 Javascript
jQuery实现隔行背景色变色
2014/11/24 Javascript
javascript实现博客园页面右下角返回顶部按钮
2015/02/22 Javascript
jQuery中的一些常见方法小结(推荐)
2016/06/13 Javascript
jQuery表单验证插件解析(推荐)
2016/07/21 Javascript
Radio 单选JS动态添加的选项onchange事件无效的解决方法
2016/12/12 Javascript
ionic开发中点击input时键盘自动弹出
2016/12/23 Javascript
图片上传之FileAPI与NodeJs
2017/01/24 NodeJs
JS实现下拉菜单列表与登录注册弹窗效果
2017/08/10 Javascript
js实现盒子移动动画效果
2020/08/09 Javascript
[46:37]LGD vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python新手经常遇到的17个错误分析
2014/07/30 Python
Python的批量远程管理和部署工具Fabric用法实例
2015/01/23 Python
Python使用matplotlib绘图无法显示中文问题的解决方法
2018/03/14 Python
在Python 字典中一键对应多个值的实例
2019/02/03 Python
Python命令行click参数用法解析
2019/12/19 Python
Python内置数据类型list各方法的性能测试过程解析
2020/01/07 Python
Python读取Excel数据并生成图表过程解析
2020/06/18 Python
门卫工作岗位职责
2013/12/17 职场文书
十八大报告观后感
2014/01/28 职场文书
幼儿园运动会加油词
2014/02/14 职场文书
会计个人实习计划书
2014/08/15 职场文书
2014党员干部四风问题对照检查材料思想汇报
2014/09/24 职场文书
《7的乘法口诀》教学反思
2016/02/18 职场文书
MySQL 亿级数据导入导出及迁移笔记
2021/06/18 MySQL
SpringBoot中HttpSessionListener的简单使用方式
2022/03/17 Java/Android
十大最强格斗系宝可梦,超梦X仅排第十,第二最重格斗礼仪
2022/03/18 日漫