一、什么是自动加载

自动加载就是当我们在当前文件中实例化一个不存在的类时,调用自动加载机制引入相应的类文件。

注:自动加载有两种方式(都是php内置的),一种是通过__autoload(),另一种是通过spl_autoload_register()。

以下两种方式的介绍中,都是执行test3.php文件。

二、通过__autoload() 实现自动加载

/data/www/test2/test2.php

<?phpclass test2
{function aa(){echo 'this is function aa';echo "<br><br>";}static function bb(){echo 'this is function bb';echo "<br><br>";}
}

/data/www/test3.php

<?php//加载过程
//1、实例化test2类,由于当前文件不存在test2类,所以会自动执行__autoload()方法,并自动将类名传过去
//2、执行完__autoload()方法之后,会加载test2/test2.php文件
//3、由于当前文件已经通过__autoload()方式require进文件test2.php了,所以也就可以调用test2.php中的方法了$test = new test2();
$test->aa();//调用aa方法
test2::bb();//调用bb静态类方法function __autoload($class)
{echo '当前自动加载的类名为'.$class."<br><br>";//此时,$class的值就是test2include_once __DIR__.'/test2/'.$class.'.php';//相当于加载了test2/test2.php
}

三、通过spl_autoload_register()实现自动加载【推荐的方式】

注:由于__autoload()自动加载方式已经逐渐被php官方废弃了,所以这里采用另一种方式spl_autoload_register来实现。

这里,test2.php文件和上面一样,只改变test3.php文件。

/data/www/test3.php

<?php//加载过程
//1、实例化test2类时,由于当前文件并没有test2类,所以php会自动调用spl_autoload_register自动加载机制
//2、调用spl_autoload_register,就会调用我们自己定义的autoload_test()方法
//3、进而引入了相应的test2.php类文件
//4、引入了相应的类文件之后,自然也就可以实例化类,并调用相应的方法了spl_autoload_register(autoload_test);$test = new test2();
$test->aa();//调用aa方法
test2::bb();//调用bb静态类方法/*** 用于实现自动加载* @param $class*/
function autoload_test($class)
{echo '当前自动加载的类名为'.$class."<br><br>";//此时,$class的值就是test2include_once __DIR__.'/test2/'.$class.'.php';//相当于加载了test2/test2.php
}

四、总结

spl_autoload_register()相比于__autoload()的优点在于:

(1)可以按需多次写spl_autoload_register注册加载函数,加载顺序按谁先注册谁先调用。__aotuload由于是全局函数只能定义一次,不够灵活。

比如下面,由于需要同时加载test2.php 以及 test4.class.php,__autoload就实现不了这个需求,而使用spl_autoload_register来实现就比较合适。

test4.class.php

<?phpclass test4
{function dd(){echo "this is test4 function dd";}}

test3.php

<?php//加载过程
//1、实例化test2类时,由于当前文件并没有test2类,所以php会自动调用spl_autoload_register自动加载机制
//2、调用spl_autoload_register,就会调用我们自己定义的autoload_test()方法
//3、进而引入了相应的test2.php类文件
//4、之后又实例化了test4类,test4类在当前文件同样没有,这时php会自动调用spl_autoload_register自动加载机制
//4.1 首先调用第一个注册自动加载函数spl_autoload_register(autoload_test),加载之后没有找到test4类
//4.2 所以php会继续调用第二个自动注册函数spl_autoload_register(autoload_test4)
//4.3 这时,终于找到test4类了,也就不用继续在往下找了
//5、引入了相应的类文件之后,自然也就可以实例化类,并调用相应的方法了spl_autoload_register(autoload_test);
spl_autoload_register(autoload_test4);$test = new test2();
$test->aa();//调用aa方法
test2::bb();//调用bb静态类方法$test4 = new test4();
$test4->dd();/*** 用于实现自动加载* @param $class*/
function autoload_test($class)
{echo '当前自动加载的类名为'.$class."<br><br>";//此时,$class的值就是test2include_once __DIR__.'/test2/'.$class.'.php';//相当于加载了test2/test2.php
}function autoload_test4($class)
{echo '当前自动加载的类名为'.$class."<br><br>";//此时,$class的值就是test4include_once __DIR__.'/'.$class.'.class.php';//相当于加载了test4.class.php
}

(2)spl_autoload_register()可以被catch到错误,而__aotuload不能。

(3)spl_autoload_register注册的加载函数可以按需被spl_autoload_unregister掉

还有,值得注意的是,如果对类文件加入了命名空间,就必须保证正确的加载了类文件的同时,还要通过use引入对应的命名空间。

php自动加载机制的实现相关推荐

  1. PHP的autoload自动加载机制使用说明

    2019独角兽企业重金招聘Python工程师标准>>> 在PHP开发过程中,如果希望从外部引入一个class,通常会使用include和require方法,去把定义这个class的文 ...

  2. python类加载机制_PHP面向对象自动加载机制原理与用法分析

    本文实例讲述了PHP面向对象自动加载机制原理与用法.分享给大家供大家参考,具体如下: 在学习PHP的面向对象的时候,会知道很多"语法糖",也就是魔术方法.有一个加自动加载的魔术方法 ...

  3. Atitit. 木马病毒的外部class自动加载机制------加载class的方法总结

    Atitit. 木马病毒的外部class自动加载机制------加载class的方法总结 Atitit.java load class methods 1. 动态加载jar文件和class文件. 1 ...

  4. php自动加载机制简述,PHP自动加载机制实例详解

    本文实例讲述了PHP自动加载机制.,具体如下: 在php中,我们一般使用 require, requre_once, include, include_once 这四个命令来加载其他php文件,这在一 ...

  5. thinkphp 框架自动加载原理_thinkPHP5.0框架自动加载机制分析

    本文实例讲述了thinkPHP5.0框架自动加载机制.分享给大家供大家参考,具体如下: 概述 ThinkPHP5.0 真正实现了按需加载,所有类库采用自动加载机制,并且支持类库映射和composer类 ...

  6. Linux内核模块自动加载机制 .

    标题http://www.osplay.org/modules/article/view.article.php?7 思考 如果想让内核启动过程中自动加载某个模块该怎么做呢?最容易想到的方法就是到/e ...

  7. PHP自动加载__autoload的工作机制

    PHP自动加载__autoload的工作机制 PHP的懒加载lazy loading 在 2011年11月12日 那天写的     已经有 4559 次阅读了 感谢 参考或原文 服务器君一共花费了11 ...

  8. log4j 源码解析_log4j1.x设置自动加载log4j.xml

    在没有设置自动加载log4j.xml的时候,一般我们需要这么处理 static void initLogger() {System.out.println("configurating lo ...

  9. thinkphp 框架自动加载原理_ThinkPHP5分析Part 1 基本框架流程

    ThinkPHP是一个免费开源的,快速.简单的面向对象的轻量级PHP开发框架,是为了敏捷WEB应用开发和简化企业应用开发而诞生的.ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能 ...

最新文章

  1. UA OPTI501 电磁波 LIH介质中的平面波1 平面波的性质
  2. 2020计算机报名要提前多久,2020年9月计算机等级报名需要多少步骤
  3. uva 11992 - Fast Matrix Operations
  4. android选项菜单源代码,Android应用程序----UI界面控件(菜单menu)
  5. 如何设置oracle_home变量,oracle-如何在Ubuntu 9.x上正确设置ORACLE_HOME变量?
  6. JS中移动端项目取余数和switch于PC端的不同
  7. AI 专利之争:小米超华为,国家电网才是大 Boss?
  8. IT民工系列——c#控制Word的类库。对com操作进行了封装
  9. PS照片换背景,证件照更换背景色
  10. 南非认证_南非2008-与孩子和婴儿长途旅行
  11. vue项目中获取今天,昨天,明天时间方法
  12. IDEA 自动导入的配置(Auto import)
  13. 共享姨妈巾出来了成为共享家族中的热门产品
  14. BlueTooth: 蓝牙基带数据传输机理分析
  15. 街头立体画的创作过程
  16. 大学生java 实训总结
  17. 使用antigen轻松打造赏心悦目的shell环境
  18. 多项式学习笔记[二](全网最详细!有图有代码有解释有例题有总结!)
  19. linux 笔记本电脑_购买支持Linux的笔记本电脑
  20. 让Android的emulator支持web camera

热门文章

  1. WPF效果第一百七十八篇ItemsControl旋转
  2. 初识MASA Blazor
  3. Blazor 组件之间使用 EventCallback 进行通信
  4. Windows 程序包管理器 1.0 正式发布
  5. 自由、开源及其敌人 —— RMS事件簿
  6. BeetleX.WebFamily针对Web SPA应用的改进
  7. 聊聊如何构建自驱团队(3)
  8. EFCore 5 新特性 Savepoints
  9. 使用Azure DevOps Pipeline实现.Net Core程序的CD
  10. .NET Core开发实战(第14课:自定义配置数据源:低成本实现定制化配置方案)--学习笔记...