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 相关文章推荐
IIS6.0+PHP5.x+MySQL5.x+Zend3.0x+GD+phpMyAdmin2.8x通用安装实例(已经完成)
Dec 06 PHP
PHP 的几个配置文件函数
Dec 21 PHP
require(),include(),require_once()和include_once()的异同
Jan 02 PHP
thinkphp获取栏目和文章当前位置的方法
Oct 29 PHP
初识Laravel
Oct 30 PHP
php随机获取金山词霸每日一句的方法
Jul 09 PHP
php+redis在实际项目中HTTP 500: Internal Server Error故障排除
Feb 05 PHP
PHP巧妙利用位运算实现网站权限管理的方法
Mar 12 PHP
自制PHP框架之模型与数据库
May 07 PHP
PHP对称加密算法(DES/AES)类的实现代码
Nov 14 PHP
详解php与ethereum客户端交互
Apr 28 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
Apr 14 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
php批量删除数据
2007/01/18 PHP
php获取mysql版本的几种方法小结
2008/03/25 PHP
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
2012/04/09 PHP
php+mysql数据库实现无限分类的方法
2014/12/12 PHP
php使用for语句输出三角形的方法
2015/06/09 PHP
php抛出异常与捕捉特定类型的异常详解
2016/10/26 PHP
Select标签下拉列表二级联动级联实例代码
2014/02/07 Javascript
js常用数组操作方法简明总结
2014/06/20 Javascript
js点击返回跳转到指定页面实现过程
2020/08/20 Javascript
DOM操作和jQuery实现选项移动操作的简单实例
2016/06/07 Javascript
微信小程序链接传参并跳转新页面
2016/11/29 Javascript
基于jQuery实现火焰灯效果导航菜单
2017/01/04 Javascript
VUE2.0+ElementUI2.0表格el-table实现表头扩展el-tooltip
2018/11/30 Javascript
layui table单元格事件修改值的方法
2019/09/24 Javascript
微信小程序后端(java)开发流程的详细步骤
2019/11/13 Javascript
Vue实现图片与文字混输效果
2019/12/04 Javascript
[01:34]2014DOTA2展望TI 剑指西雅图VG战队专访
2014/06/30 DOTA
[00:27]DOTA2次级职业联赛 - Lilith战队宣传片
2014/12/01 DOTA
python抓取网页图片并放到指定文件夹
2014/04/24 Python
python素数筛选法浅析
2018/03/19 Python
Python中的函数式编程:不可变的数据结构
2018/10/08 Python
记一次python 内存泄漏问题及解决过程
2018/11/29 Python
纯CSS实现菜单、导航栏的3D翻转动画效果
2014/04/23 HTML / CSS
凯特方迪化妆品官网:Kat Von D Beauty
2016/11/15 全球购物
linux面试相关问题
2012/08/11 面试题
linux比较文件内容的命令是什么
2013/03/04 面试题
How to spawning asynchronous work in J2EE
2016/08/29 面试题
《桥》教学反思
2014/04/09 职场文书
爱情保证书大全
2014/04/29 职场文书
组织鉴定材料
2014/06/02 职场文书
2014幼儿园小班工作总结
2014/11/10 职场文书
实习科室评语
2015/01/04 职场文书
海上钢琴师观后感
2015/06/03 职场文书
2015年小学财务工作总结
2015/07/20 职场文书
干货:如何写好工作计划!
2019/05/17 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书