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 分页类(模仿google)-面试题目解答
Sep 13 PHP
通过PHP current函数获取未知字符键名数组第一个元素的值
Jun 24 PHP
Yii2使用小技巧之通过 Composer 添加 FontAwesome 字体资源
Jun 22 PHP
php插入排序法实现数组排序实例
Feb 16 PHP
PHP面向对象之后期静态绑定功能介绍
May 18 PHP
简单介绍win7下搭建apache+php+mysql开发环境
Aug 06 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
Apr 07 PHP
如何离线执行php任务
Feb 21 PHP
Symfony2针对输入时间进行查询的方法分析
Jun 28 PHP
thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
Oct 10 PHP
PHP使用openssl扩展实现加解密方法示例
Feb 20 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
Mar 09 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下通过file_get_contents的代理使用方法
2011/02/16 PHP
浅析PHP的ASCII码转换类
2013/07/05 PHP
PHP实现通过二维数组键值获取一维键名操作示例
2019/10/11 PHP
JavaScript?Apple设备检测示例代码
2013/11/15 Javascript
javascript模拟订火车票和退票示例
2014/04/24 Javascript
js实现格式化金额,字符,时间的方法
2015/02/26 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
2015/08/11 Javascript
关于获取DIV内部内容报错的原因分析及解决办法
2016/01/29 Javascript
JavaScript常用函数工具集:lao-utils
2016/03/01 Javascript
Javascript简写条件语句(推荐)
2016/06/12 Javascript
jQuery树形控件zTree使用小结
2016/08/02 Javascript
jquery基本选择器匹配多个元素的实现方法
2016/09/05 Javascript
详解Angular 4 表单快速入门
2017/06/05 Javascript
基于jQuery选择器之表单对象属性筛选选择器的实例
2017/09/19 jQuery
js截取字符串功能的实现方法
2017/09/27 Javascript
node.js基于express使用websocket的方法
2017/11/09 Javascript
Vue.js用法详解
2017/11/13 Javascript
vue中实现methods一个方法调用另外一个方法
2018/02/08 Javascript
React中使用UEditor百度富文本的方法
2018/08/22 Javascript
Nuxt.js实现一个SSR的前端博客的示例代码
2019/09/06 Javascript
vue 微信分享回调iOS和安卓回调出现错误的解决
2020/09/07 Javascript
Webpack的Loader和Plugin的区别
2020/11/09 Javascript
跟老齐学Python之做一个小游戏
2014/09/28 Python
Python中使用摄像头实现简单的延时摄影技术
2015/03/27 Python
Python使用CMD模块更优雅的运行脚本
2015/05/11 Python
深入理解Django的自定义过滤器
2017/10/17 Python
pytorch实现mnist数据集的图像可视化及保存
2020/01/14 Python
Python Sphinx使用实例及问题解决
2020/01/17 Python
基于python连接oracle导并出数据文件
2020/04/28 Python
Python内置函数locals和globals对比
2020/04/28 Python
用CSS禁用输入法(CSS3 UI规范)实例解析
2012/12/04 HTML / CSS
毕业生就业自荐信
2013/12/04 职场文书
建筑班组长岗位职责
2014/01/02 职场文书
社区矫正工作方案
2014/06/04 职场文书
抄袭同学作业检讨书1000字
2014/11/20 职场文书
给医院的感谢信
2015/01/21 职场文书