thinkphp3.2.3 命名空间

来源:互联网 发布:游戏模型制作软件 编辑:程序博客网 时间:2024/06/05 23:40

命名空间:

1、autoload自动加载类(命名空间)$class,写入static $_map(第一次)

2、判断是否符合命名空间格式

 2.1 若为命名空间则通过字符串处理取出其根命名空间

2.1.1 若其根命名空间属于ThinkPhP/Library/ 下已有目录或自己创建的目录则命名空间自动定位为:$path = LIB_PATH;即物理路径

如E:\xamppp\htdocs\thinkphp3.2.3\ThinkPHP\Library/

2.1.2 若其根命名空间不属于ThinkPhP/Library/下,则取出其根命名空间路径$path

若属于配置文件中自定义的命名空间根目录下

则$path = "自定义的命名空间根目录的物理路径"./;

否则 $path =APP_PATH;  //即以当前访问模块名为命名空间根目录 ./Application/

     2.1.3 根据$path,$class,$取出所调用类的路径$filename

$filename = $path. str_replace('\\', '/', $class) . "规定的类文件后缀" 

如:E:\xamppp\htdocs\thinkphp3.2.3\ThinkPHP\Library/Think/Storage.class.php

     $path= E:\xamppp\htdocs\thinkphp3.2.3\ThinkPHP\Library/

     str_replace('\\', '/', $class)= Think/Storage

     "规定的类文件后缀" = .class.php

     2.1.4  判断$filename是否为文件和大小写检测,include

2.2 如果不符合命名空间格式 而且 APP_USE_NAMESPACE=>false即配置为应用类库不使用命名空间

则自动加载类库层当前$class类似为IndexController,BaseModel这种形式,例: 'APP_AUTOLOAD_LAYER'=>'Controller,Model', 

// 自动加载的应用类库层(配置文件中配置)

2.2.1若$class后缀与APP_AUTOLOAD_LAYER中的相同,如IndexController后缀与APP_AUTOLOAD_LAYER中的Controller相同,设$layer为APP_AUTOLOAD_LAYER中元素,例:$layer=Controller

则取当前模块路径MODULE_PATH  //如:./Application/Home/ , 然后组合类路径

require_cache(MODULE_PATH .$layer .'/' .$class ."规定的类文件后缀")

     require_cache //优化的require_once 不重复引用

     例:

      ./Application/Home/Controller/IndexController.class.php

      MODULE_PATH=  ./Application/Home/

      $layer= Controller

      $class= IndexController

      "规定的类文件后缀" = .class.php

2.2.2 若$class后缀与APP_AUTOLOAD_LAYER中的不相同,则根据自动加载路径设置进行尝试索 'APP_AUTOLOAD_PATH'=>''(配置文件中配置)

     设$path为APP_AUTOLOAD_LAYER中的路径

import($path . ',' .$class)           

 

public static function autoload($class) {
   
// 检查是否存在映射
   
if(isset(self::$_map[$class])) {
       
include self::$_map[$class];
   
}elseif(false !== strpos($class,'\\')){
     
$name          =   strstr($class'\\'true);
     
if(in_array($name,array('Think','Org','Behavior','Com','Vendor')) || is_dir(LIB_PATH.$name)){
         
// Library目录下面的命名空间自动定位
         
$path       =   LIB_PATH;
     
}else{
         
// 检测自定义命名空间 否则就以模块为命名空间
         
$namespace =  C('AUTOLOAD_NAMESPACE');
         
$path       =   isset($namespace[$name])? dirname($namespace[$name]).'/' APP_PATH;
     
}
     
$filename      =   $path . str_replace('\\''/'$class) . EXT;
     
if(is_file($filename)) {
         
// Win环境下面严格区分大小写
         
if (IS_WIN && false === strpos(str_replace('/''\\'realpath($filename))$class EXT)){
             
return ;
         
}
         
include $filename;
     
}
    }
elseif (!C('APP_USE_NAMESPACE')) {
       
// 自动加载的类库层
       
foreach(explode(',',C('APP_AUTOLOAD_LAYER')) as $layer){
           
if(substr($class,-strlen($layer))==$layer){
               
if(require_cache(MODULE_PATH.$layer.'/'.$class.EXT)) {
                   
return ;
               
}
            }          
        }
       
// 根据自动加载路径设置进行尝试搜索
       
foreach (explode(',',C('APP_AUTOLOAD_PATH')) as $path){
           
if(import($path.'.'.$class))
               
// 如果加载类成功则返回
               
return ;
       
}
    }
}

 

1 0
原创粉丝点击