PHP面向对象自动加载机制原理与用法分析


Posted in PHP onOctober 14, 2016

本文实例讲述了PHP面向对象自动加载机制原理与用法。分享给大家供大家参考,具体如下:

在学习PHP的面向对象的时候,会知道很多“语法糖”,也就是魔术方法。有一个加自动加载的魔术方法,叫:__autoload();

先看一段代码

<?php
function __autoload($classname) {
  $filename = "./". $classname .".php";
  include_once($filename);
}
new a();

这里实例化了一个A类,但在代码块中没有A类的相关代码,按常理是应该会报错,因为没有找到对应的A类,但如果你使用了autoload()自动加载函数的话,结果就可以能不一样

PHP面向对象自动加载机制原理与用法分析

从上面的流程图:在页面实例化一个新类,就会先在当前目录找对应的类代码,如果没有就去autoload堆栈找对应的自动加载函数,如果有的话就自动加载该类,没有话就抛出错误。

这是PHP自动加载的一个机制。然后重点在后面。如果我有多个自动加载的函数,怎么办!

PHP提供了一个SPL函数

spl_autoload_register(); // 注册autoload函数

官方:spl_autoload_register() 提供了一种更加灵活的方式来实现类的自动加载。因此,不再建议使用 __autoload() 函数,在以后的版本中它可能被弃用。

然而在PHPexecl 和 PHPWord 里面都使用到了 这个函数来做自动加载,但两者有区别!!

PHPexecl 自动加载的方法(这里作者估计是Python工程师,不然花括号都没有,用缩进来表示)

public static function Register() {
    $functions = spl_autoload_functions();
    foreach ( $functions as $function)
      spl_autoload_unregister($function);
    $functions = array_merge(array(array('PHPExcel_Autoloader','Load')),$functions);
    foreach ( $functions as $function)
      $x = spl_autoload_register($function);
    return $x;
}

PHPWord 自动加载的方法

public static function Register() {
  return spl_autoload_register(array('PHPWord_Autoloader', 'Load'));
}

这两种方法,都可以完成重定义自动加载,但有区别? 如果是独立运行代码,两种情况都可以运行,但要是整合到框架中,比如YII框架。那么PHPWord的自动加载就无效了。

因为YII框架自动带有自动加载函数,而且再代码运行的时候就已经注册了,而spl_autoload_register()会将新的自动加载函数,加载autoload队列的后面。所有PHPWord在运行的时候

就调用的是YII框架定义的自动加载机制,而且不是PHPWord这种加载方式。

所以反过来看PHPexecl的加载函数,你就明白了。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php中邮箱地址正则表达式实现与详解
Apr 24 PHP
部署PHP项目应该注意的几点事项分享
Dec 20 PHP
PHP之uniqid()函数用法
Nov 03 PHP
PHP设计模式之观察者模式实例
Feb 22 PHP
php使用高斯算法实现图片的模糊处理功能示例
Nov 11 PHP
PHP实现通过CURL上传文件功能示例
May 30 PHP
Laravel框架使用Redis的方法详解
May 30 PHP
PHP基于cookie实现统计在线人数功能示例
Jan 16 PHP
PHP htmlspecialchars()函数用法与实例讲解
Mar 08 PHP
PHP添加文字水印或图片水印的水印类完整源代码与使用示例
Mar 18 PHP
PHP经典设计模式之依赖注入定义与用法详解
May 21 PHP
如何在Laravel之外使用illuminate组件详解
Sep 20 PHP
ThinkPHP打水印及设置水印位置的方法
Oct 14 #PHP
PHP 将dataurl转成图片image方法总结
Oct 14 #PHP
php版微信公众号接口实现发红包的方法
Oct 14 #PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
Oct 14 #PHP
php版银联支付接口开发简明教程
Oct 14 #PHP
PHP二进制与字符串之间的相互转换教程
Oct 14 #PHP
php基于curl主动推送最新内容给百度收录的方法
Oct 14 #PHP
You might like
探讨:如何使用PhpDocumentor生成文档
2013/06/25 PHP
PHP 二维数组根据某个字段排序的具体实现
2014/06/03 PHP
php在数组中查找指定值的方法
2015/03/17 PHP
smarty模板引擎之配置文件数据和保留数据
2015/03/30 PHP
WordPress中自定义后台管理界面配色方案的小技巧
2015/12/29 PHP
容易被忽略的JS脚本特性
2011/09/13 Javascript
js innerHTML 改变div内容的方法
2013/08/03 Javascript
jquery中常用的函数和属性详细解析
2014/03/07 Javascript
JavaScript和CSS交互的方法汇总
2014/12/02 Javascript
深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解
2015/03/05 Javascript
jquery获取及设置outerhtml的方法
2015/03/09 Javascript
jQuery插件实现静态HTML验证码校验
2015/11/06 Javascript
基于jQuery实现的双11天猫拆红包抽奖效果
2015/12/01 Javascript
JS模仿腾讯图片站的图片翻页按钮效果完整实例
2016/06/21 Javascript
vue cli使用绝对路径引用图片问题的解决
2017/12/06 Javascript
Vue中自定义全局组件的实现方法
2017/12/08 Javascript
浅谈JS的原型和继承
2019/05/08 Javascript
vue 实现搜索的结果页面支持全选与取消全选功能
2019/05/10 Javascript
在layui中使用form表单监听ajax异步验证注册的实例
2019/09/03 Javascript
vue实现表格合并功能
2020/12/01 Vue.js
python函数返回多个值的示例方法
2013/12/04 Python
python执行系统命令后获取返回值的几种方式集合
2018/05/12 Python
利用pyinstaller打包exe文件的基本教程
2019/05/02 Python
python Django的web开发实例(入门)
2019/07/31 Python
python ctypes库2_指定参数类型和返回类型详解
2019/11/19 Python
Python爬取数据并实现可视化代码解析
2020/08/12 Python
css3 线性渐变和径向渐变示例附图
2014/04/08 HTML / CSS
5分钟让你掌握css3阴影、倒影、渐变小技巧(小编推荐)
2016/08/15 HTML / CSS
Peter Millar官网:美国高档生活服饰品牌
2018/07/02 全球购物
Europcar美国/加拿大:预订汽车或卡车租赁服务
2018/11/13 全球购物
Java语言的优势
2015/01/10 面试题
劳动之星获奖感言
2014/02/01 职场文书
相亲大会策划方案
2014/06/05 职场文书
低碳日宣传活动总结
2014/07/09 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
Java设计模式中的命令模式
2022/04/28 Java/Android