## php自动加载

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

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

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

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

  1. php如何实现自动加载mp3,PHP中自动加载的几种实现

    PHP自动加载是一个很有用的技巧,我们应该在项目中尽量使用autoload来减少维护类加载的工作. 使用__autoload 在使用PHP的项目中,如何实现自动加载对于新人总是一个很疑惑的问题,一般写 ...

  2. thinkphp 框架自动加载原理_这下你应该理解ThinkPHP的Loader自动加载了

    想了很久终于要开始系列文章的编写了,期望是写出提升和面试都可以搞定的系列文章. 当你看到本文时,如果你发现咔咔没有编写到的面试热点问题或者技术难点,期待评论区指出,一起完善. 前言 目前再整理PHP进 ...

  3. php自动加载机制的实现

    一.什么是自动加载 自动加载就是当我们在当前文件中实例化一个不存在的类时,调用自动加载机制引入相应的类文件. 注:自动加载有两种方式(都是php内置的),一种是通过__autoload(),另一种是通 ...

  4. linux 自启动iptable_保存iptable规则并开机自动加载

    iptables-save 利用iptables-save命令可以将iptable规则保存到一个持久化存储的目录中,不同的系统保存的目录也有所不同(IPv4): Debian/Ubuntu: ipta ...

  5. php7.2 开启mcy扩展,phper必知必会(二)

    1.说说你对进程,线程以及协程的理解 进程:是系统进行资源分配和调度的基本单位,是基本操作系统结构的基础.进程是程序基本执行的实体.进程与进程之间是独立的,拥有完全独立的地址空间,进程的切换只发生在内 ...

  6. java面试必知必会

    java面试必知必会 面向对象 成员变量成员方法 Integer相关 double 和 Double相关 多态,向上转型 hashcode.==.equals比较 java中子类继承父类时是否继承构造 ...

  7. c2064 项不会计算为接受0个参数的函数_【JS必知必会】高阶函数详解与实战

    本文涵盖 前言 高级函数概念 函数作为参数的高阶函数 map filter reduce sort详解与实战 函数作为返回值的高阶函数 isType函数与add求和函数 如何自己创建高阶函数 前言 一 ...

  8. tableau必知必会之VMware 搭建 Tableau Server for Linux 单机环境

    tableau10.5版本推出的 Linux 版 Tableau Server,让用户能够将 Tableau 的分析平台与 Linux 的企业级功能实现更好的结合,从而简化部署和管理工作. 很多用户陆 ...

  9. 程序员必知必会之maillist篇

    程序员必知必会之maillist篇        本文最初由恋花蝶发表于http://blog.csdn.net/lanphaday,可以随意转载,但未经同意不得增删修改,转载应保留本声明,否则追究责 ...

最新文章

  1. JS 实现下载Blod文件
  2. python 模拟微信浏览器请求_使用Chrome修改user agent模拟微信内置浏览器
  3. 新手学测试----Unit Test(单元测试)
  4. SEO之Google--PageRank优化剖析(二)
  5. Android多媒体开发(3)————使用Android NKD编译havlenapetr-FFMpeg-7c27aa2
  6. FreeSWITCH mod_callcenter 整理
  7. java 多线程 银行排队_3.采用多线程模拟银行排队叫号
  8. node爬取守望先锋图片
  9. 以安全模式重启计算机,重启进入安全模式 重启电脑如何进入安全模式
  10. 云服务器防 DDoS 攻击的几种方法策略分享
  11. java计算机毕业设计体育用品购物系统源码+数据库+系统+lw文档+mybatis+运行部署
  12. 软件测试基本方法介绍
  13. EOS智能合约开发系列(六): eosio.token
  14. Android之单元测试
  15. 【QTP专题】03_Add-in Manager插件
  16. TIKTOK赚钱项目到底是真是假 有哪些?
  17. 一步一步理解日历calendar(三)
  18. 高德地图 android key,Android实现高德地图key值申请和地图显示
  19. GameFramework入口
  20. 手把手教你搭建私有云盘(发车啦)

热门文章

  1. 动态代理之Cglib浅析
  2. 浅谈MIPS地址对齐问题
  3. mysql 存储过程中limit
  4. MongoDB在不同主机间复制数据库和集合的教程_MongoDB_脚本之家
  5. 前端学习总结——CSS布局方式之传统布局
  6. javascript --- 创建一个二维数组
  7. 配置OpenCV产生flann\logger.h(66): error C4996: ‘fopen': This function or variable may be unsafe问题
  8. 11 父子组件数据关系与状态提升
  9. string类的实现(构造函数,析构函数,运算符重载)
  10. android jni java类型与c语言类型互换