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 相关文章推荐
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
Feb 11 PHP
PHP设置一边执行一边输出结果的代码
Sep 30 PHP
php模板原理讲解
Nov 13 PHP
分享下页面关键字抓取components.arrow.com站点代码
Jan 30 PHP
PHP实现单例模式最安全的做法
Jun 13 PHP
PHP has encountered a Stack overflow问题解决方法
Nov 03 PHP
php+mysql删除指定编号员工信息的方法
Jan 14 PHP
php中 ob_start等函数截取标准输出的方法
Jun 22 PHP
Yii操作数据库实现动态获取表名的方法
Mar 29 PHP
php生成txt文件实例代码介绍
Apr 28 PHP
PHP 记录访客的浏览信息方法
Jan 29 PHP
PHP的重载使用魔术方法代码实例详解
Feb 26 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最常用的2种设计模式工厂模式和单例模式介绍
2012/08/14 PHP
PHP file_get_contents设置超时处理方法
2013/09/30 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
2017/03/31 PHP
js parsefloat parseint 转换函数
2010/01/21 Javascript
iphone safari不支持position fixed的解决方法
2012/05/04 Javascript
js实现飞入星星特效代码
2014/10/17 Javascript
nodejs下打包模块archiver详解
2014/12/03 NodeJs
jquery实现的淡入淡出下拉菜单效果
2015/08/25 Javascript
AngularJs 国际化(I18n/L10n)详解
2016/09/01 Javascript
jQuery阻止移动端遮罩层后页面滚动
2017/03/15 Javascript
angular第三方包开发整理(小结)
2018/04/19 Javascript
JavaScript缓动动画函数的封装方法
2020/11/25 Javascript
[08:07]DOTA2每周TOP10 精彩击杀集锦vol.8
2014/06/25 DOTA
用Python实现通过哈希算法检测图片重复的教程
2015/04/02 Python
python使用PyGame播放Midi和Mp3文件的方法
2015/04/24 Python
python实现字符串连接的三种方法及其效率、适用场景详解
2017/01/13 Python
python方向键控制上下左右代码
2018/01/20 Python
对python实现模板生成脚本的方法详解
2019/01/30 Python
Pyqt5如何让QMessageBox按钮显示中文示例代码
2019/04/11 Python
python 实现生成均匀分布的点
2019/12/05 Python
Python中os模块功能与用法详解
2020/02/26 Python
解析html5 canvas实现背景鼠标连线动态效果代码
2019/06/17 HTML / CSS
Melijoe英国官网:法国儿童时尚网站
2016/11/18 全球购物
数据库笔试题
2013/05/09 面试题
外贸业务员求职自荐信分享
2013/09/21 职场文书
英文版餐饮业求职信
2013/10/18 职场文书
项目管理计划书
2014/01/09 职场文书
慰问敬老院活动总结
2014/04/26 职场文书
中职生求职信
2014/07/01 职场文书
教师职位说明书
2014/07/29 职场文书
2014年酒店年度工作总结
2014/12/10 职场文书
2015年超市员工工作总结
2015/05/04 职场文书
房地产项目合作意向书
2015/05/08 职场文书
如何在C++中调用Python
2021/05/21 Python
【海涛dota解说】一房久违的影魔魂守二连发
2022/04/01 DOTA
在Python 中将类对象序列化为JSON
2022/04/06 Python