深刻理解自动加载(一)

自动加载是一个很是核心的功能。在没有自动加载的时候,引用某个文件,经常须要一个很长的列表(须要把用到的)。
先用一个简单的样例:__autoload()  能够作到当在实例化某个没有的类的时候,会自动加载读取到的没有加载的文件名。须要保持文件名和类名是一致的
写俩个文件 一个 in.php
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有
ui

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当大量这样进行约定进行调用的时候,会很是麻烦,因而出现了命名空间。
调用的时候,只须要命名空间就能够约定 见下列示例
spa

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空间里的方法相似于写目录的方法。自动加载进行解析的时候,就须要进行一些灵活的变更。
  命名空间和文件引用没有必然关系,可是在解析的时候,会遇到一个比较复杂的判断状况。
code

相关文章
相关标签/搜索