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
写一个用户在线显示的程序
Oct 09 PHP
用PHP+MySql编写聊天室
Oct 09 PHP
彻底杜绝PHP的session cookie错误
Aug 09 PHP
ThinkPHP访问不存在的模块跳转到404页面的方法
Jun 19 PHP
php中ob函数缓冲机制深入理解
Aug 03 PHP
php简单的上传类分享
May 15 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
Dec 02 PHP
php中青蛙跳台阶的问题解决方法
Oct 14 PHP
利用PHP如何统计Nginx日志的User Agent数据
Mar 06 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
Mar 26 PHP
Laravel 修改验证异常的响应格式实例代码详解
May 25 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 iconv() : Detected an illegal character in input string
2010/12/05 PHP
PHP常用特殊运算符号和函数总结(php新手入门必看)
2013/02/02 PHP
PHP中预定义的6种接口介绍
2015/05/12 PHP
php使用标签替换的方式生成静态页面
2015/05/21 PHP
javascript编程起步(第五课)
2007/02/27 Javascript
JQuery 操作select标签实现代码
2010/05/14 Javascript
Js获取事件对象代码
2010/08/05 Javascript
jQuery 表单验证扩展代码(二)
2010/10/20 Javascript
关于window.pageYOffset和document.documentElement.scrollTop
2011/04/05 Javascript
jquery submit ie6下失效的原因分析及解决方法
2013/11/15 Javascript
jquery实现非叠加式的搜索框提示效果
2014/01/07 Javascript
jquery ajax 局部刷新小案例
2014/02/08 Javascript
js判断浏览器类型及设备(移动页面开发)
2015/07/30 Javascript
Jquery代码实现图片轮播效果(一)
2015/08/12 Javascript
JS实现选中当前菜单后高亮显示的导航条效果
2015/10/15 Javascript
浅析JavaScript回调函数应用
2016/05/22 Javascript
基于JavaScript实现的希尔排序算法分析
2017/04/14 Javascript
Vue2.0 slot分发内容与props验证的方法
2017/12/12 Javascript
vue小白入门教程
2018/04/02 Javascript
关于JavaScript 数组你应该知道的事情(推荐)
2019/04/10 Javascript
个人小程序接入支付解决方案
2019/05/23 Javascript
jQuery 选择器用法基础入门示例
2020/01/04 jQuery
JavaScript的一些小技巧分享
2021/01/06 Javascript
python通过字典dict判断指定键值是否存在的方法
2015/03/21 Python
Python实现删除文件但保留指定文件
2015/06/21 Python
解决pyCharm中 module 调用失败的问题
2020/02/12 Python
Python 抓取数据存储到Redis中的操作
2020/07/16 Python
python获取百度热榜链接的实例方法
2020/08/25 Python
经济实惠的豪华背包和行李袋:Packs Project
2018/10/17 全球购物
小米乌克兰网上商店:Xiaomi.UA
2019/10/29 全球购物
大学学年自我鉴定
2013/10/28 职场文书
公司法人授权委托书范本
2014/09/12 职场文书
群众路线自查报告及整改措施
2014/11/04 职场文书
机修车间主任岗位职责
2015/04/08 职场文书
小学班主任教育随笔
2015/08/15 职场文书
Spring Boot项目如何优雅实现Excel导入与导出功能
2022/06/10 Java/Android