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写的serv-u的web申请账号的程序
Oct 09 PHP
多重?l件?合查?(二)
Oct 09 PHP
用PHP读取RSS feed的代码
Aug 01 PHP
PHP编程过程中需要了解的this,self,parent的区别
Dec 30 PHP
PHP isset()与empty()的使用区别详解
Aug 29 PHP
php长字符串定义方法
Jul 12 PHP
关于使用coreseek并为其做分页的介绍
Jun 21 PHP
PHP仿博客园 个人博客(2) 数据库增添改删
Jul 05 PHP
php中Socket创建与监听实现方法
Jan 05 PHP
php中static 静态变量和普通变量的区别
Dec 01 PHP
php实现XML和数组的相互转化功能示例
Feb 08 PHP
php使用crypt()函数进行加密
Jun 08 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
递归列出所有文件和目录
2006/10/09 PHP
PHP图片上传类带图片显示
2006/11/25 PHP
深入php中var_dump方法的使用详解
2013/06/24 PHP
CodeIgniter针对数据库的连接、配置及使用方法
2016/03/03 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
2017/09/13 PHP
自己的js工具 Event封装
2009/08/21 Javascript
jquery的$(document).ready()和onload的加载顺序
2010/05/26 Javascript
jQuery动态添加删除select项(实现代码)
2013/09/03 Javascript
jQuery插件slides实现无缝轮播图特效
2015/04/17 Javascript
jQuery实现只允许输入数字和小数点的方法
2016/03/02 Javascript
javascript 面向对象实战思想分享
2017/09/07 Javascript
JS计算输出100元钱买100只鸡问题的解决方法
2018/01/04 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
2018/03/16 Javascript
详解JavaScript 中 if / if...else...替换方式
2018/07/15 Javascript
angular6的响应式表单的实现
2018/10/10 Javascript
JavaScript中this用法学习笔记
2019/03/17 Javascript
深入解读Node.js中的koa源码
2019/06/17 Javascript
JAVA面试题 static关键字详解
2019/07/16 Javascript
layui动态绑定事件的方法
2019/09/20 Javascript
[05:17]DOTA2誓师:今天我们在这里 明天TI4等我!
2014/03/26 DOTA
利用Python写一个爬妹子的爬虫
2018/06/08 Python
总结python中pass的作用
2019/02/27 Python
Python内置加密模块用法解析
2019/11/25 Python
Python for循环搭配else常见问题解决
2020/02/11 Python
在python中使用nohup命令说明
2020/04/16 Python
详解pytorch tensor和ndarray转换相关总结
2020/09/03 Python
CSS3系列教程:背景图片(背景大小和多背景图) 应用说明
2012/12/19 HTML / CSS
雅诗兰黛加拿大官网:Estee Lauder加拿大
2019/07/31 全球购物
德国滑雪和户外用品网上商店:XSPO
2019/10/30 全球购物
C#中有没有静态构造函数,如果有是做什么用的?
2016/06/04 面试题
市场开发与营销专业求职信范文
2014/05/01 职场文书
校园文化标语
2014/06/18 职场文书
信仰心得体会
2014/09/05 职场文书
劳动争议和解协议书范本
2014/11/20 职场文书
怎样写家长意见
2015/06/04 职场文书
贴吧吧主申请感言
2015/08/03 职场文书