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之第四天
Oct 09 PHP
加强版phplib的DB类
Mar 31 PHP
PHP array操作10个小技巧分享
Jun 23 PHP
Codeigniter注册登录代码示例
Jun 12 PHP
php生成二维码时出现中文乱码的解决方法
Dec 18 PHP
对PHP PDO的一些认识小结
Jan 23 PHP
php+mysqli使用面向对象方式更新数据库实例
Jan 29 PHP
php获取百度收录、百度热词及百度快照的方法
Apr 02 PHP
PHP GD库相关图像生成和处理函数小结
Sep 30 PHP
PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID
Nov 25 PHP
在IIS下安装PHP扩展的方法(超简单)
Apr 10 PHP
thinkPHP通用控制器实现方法示例
Nov 23 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脚本加密专家php解密算法
2020/09/13 PHP
PHP系统命令函数使用分析
2013/07/05 PHP
destoon二次开发常用数据库操作
2014/06/21 PHP
PHP新建类问题分析及解决思路
2015/11/19 PHP
php过滤输入操作之htmlentities与htmlspecialchars用法分析
2017/02/17 PHP
[原创]php实现数组按拼音顺序排序的方法
2017/05/03 PHP
PC端微信扫码支付成功之后自动跳转php版代码
2017/07/07 PHP
Laravel学习基础之migrate的使用教程
2017/10/11 PHP
firefox中用javascript实现鼠标位置的定位
2007/06/17 Javascript
Kibo 用于处理键盘事件的Javascript工具库
2011/10/28 Javascript
js截取字符串的两种方法及区别详解
2013/11/05 Javascript
JS记录用户登录次数实现代码
2014/01/15 Javascript
Node.js巧妙实现Web应用代码热更新
2015/10/22 Javascript
javascript定义类和类的实现实例详解
2015/12/01 Javascript
浅析ES6的八进制与二进制整数字面量
2016/08/30 Javascript
详解Node.js中的事件机制
2016/09/22 Javascript
浅谈vue-lazyload实现的详细过程
2017/08/22 Javascript
详解node服务器中打开html文件的两种方法
2017/09/18 Javascript
Python中getattr函数和hasattr函数作用详解
2016/06/14 Python
python实现将读入的多维list转为一维list的方法
2018/06/28 Python
python 读取文件并替换字段的实例
2018/07/12 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
2019/10/04 Python
python发qq消息轰炸虐狗好友思路详解(完整代码)
2020/02/15 Python
python3 实现口罩抽签的功能
2020/03/11 Python
浅析python 定时拆分备份 nginx 日志的方法
2020/04/27 Python
利用Bootstrap实现漂亮简洁的CSS3价格表实例源码
2017/03/02 HTML / CSS
Canvas与图片压缩的示例代码
2017/11/28 HTML / CSS
HTML5 canvas 瀑布流文字效果的示例代码
2018/01/31 HTML / CSS
全球第二大家装零售商:Lowe’s
2018/01/13 全球购物
什么是典型的软件三层结构?软件设计为什么要分层?软件分层有什么好处?
2012/03/14 面试题
培训协议书范本
2014/04/22 职场文书
商铺消防安全责任书
2014/07/29 职场文书
2014年化验员工作总结
2014/11/18 职场文书
个人工作保证书
2015/02/28 职场文书
格列夫游记读书笔记
2015/07/01 职场文书
解决Mysql多行子查询的使用及空值问题
2022/01/22 MySQL