深入理解自动加载(一)

自动加载是一个非常核心的功能。在没有自动加载的时候,引用某个文件,常常需要一个很长的列表(需要把用到的)。
先用一个简单的样例:__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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值