概述
命名空间:
1、autoload自动加载类(命名空间)$class,写入static $_map(第一次)
2、判断是否符合命名空间格式
2.1 若为命名空间则通过字符串处理取出其根命名空间
2.1.1 若其根命名空间属于ThinkPhP/Library/ 下已有目录或自己创建的目录则命名空间自动定位为:$path = LIB_PATH;即物理路径
如E:xamppphtdocsthinkphp3.2.3ThinkPHPLibrary/
2.1.2 若其根命名空间不属于ThinkPhP/Library/下,则取出其根命名空间路径$path
若属于配置文件中自定义的命名空间根目录下
则$path = "自定义的命名空间根目录的物理路径"./;
否则 $path =APP_PATH; //即以当前访问模块名为命名空间根目录 ./Application/
2.1.3 根据$path,$class,$取出所调用类的路径$filename
$filename = $path. str_replace('\', '/', $class) . "规定的类文件后缀"
如:E:xamppphtdocsthinkphp3.2.3ThinkPHPLibrary/Think/Storage.class.php
$path= E:xamppphtdocsthinkphp3.2.3ThinkPHPLibrary/
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 ;
}
}
}
推荐: 浮生无事的博客
最后
以上就是感动白昼为你收集整理的thinkphp3.2.3 命名空间的全部内容,希望文章能够帮你解决thinkphp3.2.3 命名空间所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复