你现在的位置:首页 > PHP网站建设知识库 > Yii > 正文

Yii框架分析之全局自动加载YiiBase::autoload

public static function autoload($className){  
    // use include so that the error PHP file may appear  
    if(isset(self::$classMap[$className]))  
        include(self::$classMap[$className]);  
    elseif(isset(self::$_coreClasses[$className]))  
        include(YII_PATH.self::$_coreClasses[$className]);  
    else  
    {  
        // include class file relying on include_path  
        if(strpos($className,'\\')===false)  // class without namespace  
        {  
            if(self::$enableIncludePath===false)  
            {  
                foreach(self::$_includePaths as $path)  
                {  
                    $classFile=$path.DIRECTORY_SEPARATOR.$className.'.php';  
                    if(is_file($classFile))  
                    {  
                        include($classFile);  
                        if(YII_DEBUG && basename(realpath($classFile))!==$className.'.php')  
                            throw new CException(Yii::t('yii','Class name "{class}" does not match class file "{file}".', array(  
                                '{class}'=>$className,  
                                '{file}'=>$classFile,  
                        )));  
                        break;  
                    }  
                }  
            }  
            else  
                include($className.'.php');  
        }  
        else  // class name with namespace in PHP 5.3  
        {  
            $namespace=str_replace('\\','.',ltrim($className,'\\'));  
            if(($path=self::getPathOfAlias($namespace))!==false)  
                include($path.'.php');  
            else  
                return false;  
        }  
            return class_exists($className,false) || interface_exists($className,false);  
        }  
    return true;  
}  

这段程序里面把加载过程分为三种情况来处理:

第一,如果需要加载得类在YiiBase::$classMap数组里面,直接通过include(self::$classMap[$className]);来加载

第二,如果需要加载的类在YiiBase::$_coreClasses数组里面,直接通过include(YII_PATH.self::$_coreClasses[$className]);来加载

第三,如果以上两个条件都不满则,则另行处理,这就是这个方法的核心了。


下面我们对第三种情况进行分析:

首先,在名字中搜索双划线\\

如果没有搜索到则说明没有namespace,$ClassName就是类名

然后看下

/** 
     * @var boolean whether to rely on PHP include path to autoload class files. Defaults to true. 
     * You may set this to be false if your hosting environment doesn't allow changing the PHP 
     * include path, or if you want to append additional autoloaders to the default Yii autoloader. 
     * @since 1.1.8 
     */  
    public static $enableIncludePath=true;