phper必知必会之类库自动加载的七种方式(三)

## php自动加载

下面显示例子的文件目录结构图

595183-20190424174446598-295299407.png

一、没有使用命名空间的几种实现

test/oneClass.php

class oneClass{public function show(){echo "这里是oneClass.php的show方法<br/>";}}

test/twoClass.php

<?phpclass twoClass{public function show(){echo "这里是twoClass.php的show方法<br/>";}}

下面7种方式都可以实现自动加载,结果都为:

这里是oneClass.php的show方法
这里是twoClass.php的show方法

方法一:index.php 使用__autoload()魔术方法实现自动加载

<?php
//7.2以后使用这个提示一个警告,Deprecated: __autoload() is deprecated, use spl_autoload_register() instead
function __autoload($classname){include './test/'.$classname.'.php';
}//调用类库如果找不到会自动执行__autoload()
$one = new oneClass();
$one->show();
$two = new twoClass();
$two->show();

运行结果

Deprecated: __autoload() is deprecated, use spl_autoload_register() instead in /Users/lidong/Desktop/wwwroot/test/April/autoload1/index.php on line 5
这里是oneClass.php的show方法
这里是twoClass.php的show方法

总结:在PHP7.2以后使用__autoload()会报一个警告,7.2之前这种方式是没提示的.这种方式,是调用一个找不到的类会自动取调用__autoload()方法然后在方法里面执行include引用,实现自动加载。

方法二:index2.php 使用spl_autoload_register()方法实现自动加载,创建自定义register方法调用

<?phpfunction register($classname){include "./test/{$classname}.php";
}spl_autoload_register("register");$one = new oneClass();
$one->show();
$two = new twoClass();
$two->show();

方法三:index3.php 使用spl_autoload_register()方法,不定义register方法直接使用回调

<?phpspl_autoload_register(function($classname){include "./test/{$classname}.php";
});$one = new oneClass();
$one->show();
$two = new twoClass();
$two->show();

方法四:index4.php 使用spl_autoload_register()方法,调用类的register方法实现自动加载

class autoLoad{public static function register($classname){include "./test/{$classname}.php";} 
}spl_autoload_register(["autoLoad","register"]);$one = new oneClass();
$one->show();
$two = new twoClass();
$two->show();

二、使用命名空间的几种实现

test2/oneClass.php

<?phpnamespace auto\test2;
class oneClass{public function show(){echo "这里是oneClass.php的show方法<br/>";}}

test2/twoClass.php

<?php
namespace auto\test2;
class twoClass{public function show(){echo "这里是twoClass.php的show方法<br/>";}}

方法五:index5.php,使用spl_autoload_register(),调用加载类的register方法,转化传递过来的命名空间实现自动加载

<?phpclass autoLoad{public static function register($classname){$arr = explode('\\', $classname);include "./test2/{$arr[2]}.php";} 
}spl_autoload_register(["autoLoad","register"]);$one = new auto\test2\oneClass();
$one->show();
$two = new auto\test2\twoClass();
$two->show();

方法六:index6.php 跟方法五类似,区别是use方法调用类实例化时可以直接使用类名,实现自动加载

<?phpuse auto\test2\oneClass;
use auto\test2\twoClass;class autoLoad{public static function register($classname){$arr = explode('\\', $classname);include "./test2/{$arr[2]}.php";} 
}spl_autoload_register(["autoLoad","register"]);$one = new oneClass();
$one->show();
$two = new twoClass();
$two->show();

方法七:index7.php 与方法五和六思路一致,只不过加载类放在外部不是引用在统一文件,要点就是命名空间定义的类,要使用也要先include,实现自动加载

autoLoad.php
<?phpnamespace auto;
class autoLoad{public static function register($classname){$arr = explode('\\', $classname);include "./test2/{$arr[2]}.php";} 
}
index7.php
<?php
use auto\test2\oneClass;
use auto\test2\twoClass;include "./autoLoad.php";spl_autoload_register(["auto\autoLoad","register"]);$one = new oneClass();
$one->show();
$two = new twoClass();
$two->show();

总结:所有的自动加载思想都是调用一个没引用的类库会,PHP会自动执行的一个加载方法,这个方法有可能是类的方法也有可能是普通方法,但不管怎么样都最终使用include执行文件包含,只不过命名空间需要转化下获取类名。另外值得注意的是,如果是一个php的框架自动加载实现也基本一致,只不过他会根据不同文件夹下面的定义判断后include来实现不同文件夹下文件的引用,来实现整个框架的自动加载。

转载于:https://www.cnblogs.com/lisqiong/p/10763793.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264159.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎样的项目才算是一个成功的项目 于病视神,未有形而除之

http://www.nowamagic.net/librarys/veda/detail/2466参与各种项目已经好几年了&#xff0c;大大小小的项目也做过了很多。经历了很多&#xff0c;也明白了很多。现在反思下&#xff0c;什么样的项目才是成功的项目&#xff1f; 是把项目按照必要的约束&#xff08;时间&#x…

sqlserver55555_sqlserver把小数点后面多余的0去掉

Sql中想把小数点后多余的0去掉,怎么办?select 5000/10000.0 --想变成0.5select 5500/10000.0 --想变成0.55select 5550/10000.0 --想变成0.555select 5555/10000.0 --想变成0.5555其结果分别为&#xff1a;0.5000000 0.5500000 0.5550000 0.5555000一、如果想去掉数字5后…

一个产品留言统计查寻的分析比较

有产品表Product(ProductId,Name,Username,AddTime...) 留言表 Agency(AgencyId, ProductId, TargetUsername,IsRead...)其中Agency.TargetUsername与Product.Username指这个产品的发布用户(以及这条留言的目标用户--不是指发留言的人), 现在要打印某一指定用户的如下列表…

链式队列的实现(头文件及源程序)

链式队列的实现&#xff08;头文件及源程序&#xff09; Linkedqueue.h #ifndef __LINKEDQUEUE_H__ #define __LINKEDQUEUE_H__//元素类型定义 typedef int ElemType_Queue;//结点结构体类型定义 typedef struct Node_Queue {ElemType_Queue data;struct Node_Queue *next;}N…

单点登录的实现

单点登录的实现 token验证&#xff1a;https://blog.csdn.net/sleepwalker_1992/article/details/82974703转载于:https://www.cnblogs.com/yishenweilv/p/10764653.html

c++ 箭头符号怎么打_焊接图纸符号标注图解示例,焊接符号标注实例及方法

基本坡口符号坡口符号(注&#xff1a;图中“破”应为“坡”)焊接图纸符号标注图解示例焊接符号标注实例及方法在焊接结构图样上&#xff0c;焊接方法可按国家标准GB5185-85的规定用阿拉伯效字表示&#xff0c;标注在指引线的尾部。常用焊接方法代号见表3-9所示。如果是组合焊接…

Tekson的数据结构程序9——搜索

9. 搜索 搜索方法有&#xff1a;顺序搜索法&#xff08;即链表搜索法&#xff09;、二分搜索法、二叉树搜索法、哈希表搜索法、TRIE树搜索法。 其中&#xff0c;链表搜索法的搜索速度为&#xff1b;二分搜索法与二叉树搜索法的搜索速度为&#xff1b;哈希表的搜索速度为&#x…

演示: GTS流量×××和CAR流量监管的效果及相关实践计划

演示&#xff1a; GTS流量和CAR流量监管的效果及相关实践计划演示目标&#xff1a;1 理解clock rate(时钟频率)和bandwidth&#xff08;带宽&#xff09;与接入速率的关系2 在模拟运营商的接入路由器ISP上配置CAR监管用户流量到认购速率64K3 取证模拟的企业网络以128K的接入速率…

给所有的交叉编译工具创建软链接

给所有的交叉编译工具创建软链接 #!/bin/bash #给所有的交叉编译工具创建软链接echo "正在给所有的交叉编译工具创建软链接..." filenamsls arm-linux-gnueabi-* #获取当前文件夹下的所有以arm-linux-gnueabi-文件名开头的文件名 cont0 #记录软链接完成个数…

写在前面

硕士毕业在即&#xff0c;我的纯CV之路即将开始&#xff0c;老师提到了潜在的研究方向&#xff0c;一个全新的领域&#xff0c;可以说是新的起点。未来四年&#xff0c;我要想不碌碌而为&#xff0c;不像硕士期间一样“泛泛而学”&#xff0c;我必须从理论到实践都做好非常扎实…

httpclient封装获取响应实体_Httpclient 接口自动化

好久木写啦&#xff01;&#xff01;&#xff01;好久木写啦&#xff01;&#xff01;&#xff01;心血来潮分享点小白的东西&#xff01;&#xff01;&#xff01;废话少说直接干货&#xff01;&#xff01;&#xff01;本文核心是将如何从数据驱动开始&#xff0c;以报告结尾…

服务器控件开发之基本概念

利用ASP.NET 2.0技术&#xff0c;创建Web自定义服务器控件并不是一件轻松的事情。因为&#xff0c;这需要开发人员了解并能够灵活应用多种Web开发技术&#xff0c;例如&#xff0c;CSS样式表、客户端脚本语言、.NET开发语言、服务器控件开发技术&#xff0c;甚至是当前最火的AJ…

如何在Django模板中注入全局变量

我们在做一些网站项目的时候&#xff0c;可能会遇到需要把某个全局变量注入到所有页面的情况&#xff0c;比如我们做一个在线商城&#xff0c;那么可能需要将用户的资料&#xff1a;比如用户的账号、用户的姓名等注入到每个页面里面。但是如果用常规的方法&#xff0c;也就是在…

JavaScript 定时器

setInterval 每隔time时间后执行内部代码&#xff0c;后边改的time时间并不起作用 var time 2000; var obj setInterval(() > {}, time);//obj 返回的是一个数字&#xff0c;作为唯一标识time200; //不起作用clearInterval(obj) //清除计时器setInterval("console.…

Ubuntu18.04更换为国内源

Ubuntu18.04更换为国内源 1、打开Linux终端&#xff0c;执行下列命令&#xff0c;将源文件备份&#xff0c;以防万一。 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak2、选择下列任意一个源&#xff0c;将其复制 ​ 2.1 阿里源 deb http://mirrors.aliyun.com/…

如何关闭大疆gps_如何使用djisdkforwindows从mavic 2获取gps数据?

我使用windows sdk。我正在尝试使用以下方法获取gps数据:var flightControllerHandler _djiManagerInstance.ComponentManager.GetFlightControllerHandler(ProductIndex, ComponentIndex);flightControllerHandler.AircraftLocationChanged - QuadcopterOnAircraftLocationCh…

跨线程访问控件

【转帖】 我们在做winform应用的时候&#xff0c;大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题&#xff0c;下面我将详细的介绍。 首先来看传统方法&#xff1a; public partial class Form1 : Form { public Fo…

解析Nginx负载均衡

摘要&#xff1a;对于一个大型网站来说&#xff0c;负载均衡是永恒的话题。随着硬件技术的迅猛发展&#xff0c;越来越多的负载均衡硬件设备涌现出来&#xff0c;如F5 BIG-IP、Citrix NetScaler、Radware等等&#xff0c;虽然可以解决问题&#xff0c;但其高昂的价格却往往令人…

基于vue+mint-ui的mobile-h5的项目说明

基于vuemint-ui的mobile-h5的项目说明转载于:https://www.cnblogs.com/ysx215/p/10768656.html

Ubuntu20.04更换为国内源

Ubuntu20.04更换为国内源 1、打开Linux终端&#xff0c;执行下列命令&#xff0c;将源文件备份&#xff0c;以防万一。 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak2、选择下列任意一个源&#xff0c;将其复制 ​ 2.1 阿里源 deb http://mirrors.aliyun.com/…