php自动加载机制的实现
一、什么是自动加载
自动加载就是当我们在当前文件中实例化一个不存在的类时,调用自动加载机制引入相应的类文件。
注:自动加载有两种方式(都是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自动加载机制的实现相关推荐
- PHP的autoload自动加载机制使用说明
2019独角兽企业重金招聘Python工程师标准>>> 在PHP开发过程中,如果希望从外部引入一个class,通常会使用include和require方法,去把定义这个class的文 ...
- python类加载机制_PHP面向对象自动加载机制原理与用法分析
本文实例讲述了PHP面向对象自动加载机制原理与用法.分享给大家供大家参考,具体如下: 在学习PHP的面向对象的时候,会知道很多"语法糖",也就是魔术方法.有一个加自动加载的魔术方法 ...
- Atitit. 木马病毒的外部class自动加载机制------加载class的方法总结
Atitit. 木马病毒的外部class自动加载机制------加载class的方法总结 Atitit.java load class methods 1. 动态加载jar文件和class文件. 1 ...
- php自动加载机制简述,PHP自动加载机制实例详解
本文实例讲述了PHP自动加载机制.,具体如下: 在php中,我们一般使用 require, requre_once, include, include_once 这四个命令来加载其他php文件,这在一 ...
- thinkphp 框架自动加载原理_thinkPHP5.0框架自动加载机制分析
本文实例讲述了thinkPHP5.0框架自动加载机制.分享给大家供大家参考,具体如下: 概述 ThinkPHP5.0 真正实现了按需加载,所有类库采用自动加载机制,并且支持类库映射和composer类 ...
- Linux内核模块自动加载机制 .
标题http://www.osplay.org/modules/article/view.article.php?7 思考 如果想让内核启动过程中自动加载某个模块该怎么做呢?最容易想到的方法就是到/e ...
- PHP自动加载__autoload的工作机制
PHP自动加载__autoload的工作机制 PHP的懒加载lazy loading 在 2011年11月12日 那天写的 已经有 4559 次阅读了 感谢 参考或原文 服务器君一共花费了11 ...
- log4j 源码解析_log4j1.x设置自动加载log4j.xml
在没有设置自动加载log4j.xml的时候,一般我们需要这么处理 static void initLogger() {System.out.println("configurating lo ...
- thinkphp 框架自动加载原理_ThinkPHP5分析Part 1 基本框架流程
ThinkPHP是一个免费开源的,快速.简单的面向对象的轻量级PHP开发框架,是为了敏捷WEB应用开发和简化企业应用开发而诞生的.ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能 ...
最新文章
- UA OPTI501 电磁波 LIH介质中的平面波1 平面波的性质
- 2020计算机报名要提前多久,2020年9月计算机等级报名需要多少步骤
- uva 11992 - Fast Matrix Operations
- android选项菜单源代码,Android应用程序----UI界面控件(菜单menu)
- 如何设置oracle_home变量,oracle-如何在Ubuntu 9.x上正确设置ORACLE_HOME变量?
- JS中移动端项目取余数和switch于PC端的不同
- AI 专利之争:小米超华为,国家电网才是大 Boss?
- IT民工系列——c#控制Word的类库。对com操作进行了封装
- PS照片换背景,证件照更换背景色
- 南非认证_南非2008-与孩子和婴儿长途旅行
- vue项目中获取今天,昨天,明天时间方法
- IDEA 自动导入的配置(Auto import)
- 共享姨妈巾出来了成为共享家族中的热门产品
- BlueTooth: 蓝牙基带数据传输机理分析
- 街头立体画的创作过程
- 大学生java 实训总结
- 使用antigen轻松打造赏心悦目的shell环境
- 多项式学习笔记[二](全网最详细!有图有代码有解释有例题有总结!)
- linux 笔记本电脑_购买支持Linux的笔记本电脑
- 让Android的emulator支持web camera
热门文章
- WPF效果第一百七十八篇ItemsControl旋转
- 初识MASA Blazor
- Blazor 组件之间使用 EventCallback 进行通信
- Windows 程序包管理器 1.0 正式发布
- 自由、开源及其敌人 —— RMS事件簿
- BeetleX.WebFamily针对Web SPA应用的改进
- 聊聊如何构建自驱团队(3)
- EFCore 5 新特性 Savepoints
- 使用Azure DevOps Pipeline实现.Net Core程序的CD
- .NET Core开发实战(第14课:自定义配置数据源:低成本实现定制化配置方案)--学习笔记...