当前位置: 首页 > news >正文

深入理解自动加载(一)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

自动加载是一个非常核心的功能。在没有自动加载的时候,引用某个文件,常常需要一个很长的列表(需要把用到的)。
先用一个简单的样例:__autoload()  可以做到当在实例化某个没有的类的时候,会自动加载读取到的没有加载的文件名。需要保持文件名和类名是一致的
写俩个文件 一个 in.php

<?php
class  in  {
  public  function  test() {
       echo  '123';
  }
   public  function test2() {
        echo   "456";
   }
}
?>

另外一个文件index.php

<?php
function  __autoload($class){
    require   $class.".php";
}
$a = new in();
$a->test();
?>

但是__autoload函数只能用一次,当俩个项目合在一起的时候,只有一个会生效,另外一个无法使用。于是增加了SPL函数
spl_autoload_register();
可以同时加载N种自动加载规则,最常用的,重改index.php有

function load($class){
 include $class.".php";
}
spl_autoload_register("load");
new in();

自动加载虽然很好用,但是到了PHP5.3以后,引入了命名空间namespace后,自动加载的复杂度又得到了提升。这里先介绍下PHP5.3的命名空间新概念:命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误。这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀。但是约定前缀,会带来大量的额外代码。报告里的评论和文章里的评论可能都有comment,Article和Board都有这个函数,于是要进行各自约定Article_comment,Board_comment当大量这样进行约定进行调用的时候,会非常麻烦,于是出现了命名空间。
调用的时候,只需要命名空间就可以约定 见下列示例

namespace  test\index;
class  test1 {
    public   function   a() {
          echo   "a";
    }
}
  function  b() {
      return   7;
   }
namespace  test\test;
function  b() {
      return   5;
   }
 echo   \test\index\b();

  在namespace  test\test的空间里,调用test\index空间里的方法类似于写目录的方法。自动加载进行解析的时候,就需要进行一些灵活的变动。
  命名空间和文件引用没有必然关系,但是在解析的时候,会遇到一个比较复杂的判断情况。

转载于:https://my.oschina.net/xiongyuanliang/blog/542834

相关文章:

  • Javascript书籍推荐----(步步为赢)
  • viewcontroller的跳转问题
  • 互联网+时代,用数据说话
  • 亲测,手把手教你用Python抢票
  • 控制显示行头列(Indicator)
  • bootstrap按钮组(一)
  • centos git服务器搭建配置
  • powerdesigner奇淫技
  • 运营商级网络部署开启 物联网普及为时不远
  • SwizzleMethod 黑魔法
  • bootstrap-wysiwyg整合ajaxFileUpload实现图片实时上传刷新
  • 别成为网络安全垃圾数据收藏家
  • msyql 笔记
  • python连接sql server数据库
  • Mysql详解my-innodb-heavy-4G.cnf 配置
  • 230. Kth Smallest Element in a BST
  • Angular数据绑定机制
  • Apache Pulsar 2.1 重磅发布
  • C学习-枚举(九)
  • EventListener原理
  • java8 Stream Pipelines 浅析
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • python大佬养成计划----difflib模块
  • React的组件模式
  • SpringCloud集成分布式事务LCN (一)
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 基于组件的设计工作流与界面抽象
  • 小程序测试方案初探
  • 怎么把视频里的音乐提取出来
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​用户画像从0到100的构建思路
  • #Lua:Lua调用C++生成的DLL库
  • (175)FPGA门控时钟技术
  • (30)数组元素和与数字和的绝对差
  • (a /b)*c的值
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (C语言)球球大作战
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • .“空心村”成因分析及解决对策122344
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .Net Core 中间件验签
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • .NET应用架构设计:原则、模式与实践 目录预览
  • @Autowired和@Resource装配
  • @property @synthesize @dynamic 及相关属性作用探究
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器