YII2框架分析1:自动加载类

* YII2版本为 yii basic 2.0.0RC

* YII2框架在 /vendor/yiisoft/yii2 目录下,所涉及文件都以此目录为基础

* 文本为个人学习内容,如有不正确的地方欢迎指正。

在web的入口文件index.php中有包含yii2的核心文件Yii.php

require(__DIR__ . ‘/../../vendor/yiisoft/yii2/Yii.php‘);

Yii.php 中 有一个类 Yii 继承自 \yii\BaseYii

class Yii extends \yii\BaseYii
{
}

紧接着就注册了自动加载类函数

spl_autoload_register([‘Yii‘, ‘autoload‘], true, true);

Yii类中的autoload函数,因为Yii类为空类,所以这个函数在BaseYii中找。

public static function autoload($className)

首先这个函数先判断一下$className在不在static::$classMap数组中,如果在这个数组中,则取数组中的值为$classFile,然后再取$classFile中的第一个字符判断下是否为@如果为@,则表示包含别名。需要使用 static::getAlias 函数获取到实际的类文件路径(分析getAlias函数)。实际代码如下:

        if (isset(static::$classMap[$className])) {
            $classFile = static::$classMap[$className];
            if ($classFile[0] === ‘@‘) {
                $classFile = static::getAlias($classFile);
            }
        } 

static::$classMap 在Yii.php中包含classes.php文件中获取。

Yii::$classMap = include(__DIR__ . ‘/classes.php‘);

如果$className不在static::$classMap中,则拼接出类文件路径,其中也支持@别名

如果文件不存在或者类名不正确,则返回。代码如下:

        } elseif (strpos($className, ‘\\‘) !== false) {
            $classFile = static::getAlias(‘@‘ . str_replace(‘\\‘, ‘/‘, $className) . ‘.php‘, false);
            if ($classFile === false || !is_file($classFile)) {
                return;
            }
        } else {
            return;
        }

最后,包含类文件后,判断一下类是否存在,如果不存在。抛出错误。

        if (YII_DEBUG && !class_exists($className, false) && !interface_exists($className, false) && !trait_exists($className, false)) {
            throw new UnknownClassException("Unable to find ‘$className‘ in file: $classFile. Namespace missing?");
        }
时间: 2024-10-09 06:34:42

YII2框架分析1:自动加载类的相关文章

框架开发(五)----自动加载类

一 . 为什么自动加载 自动加载字面的意思就不解释了.我这里自动加载类解析下 是自动加载类文件的意思.__autoload方法完全可行,但是不要问为什么,还是用spl_autoload_register.不只是灵活,而且就是灵活,还是灵活,体现在__autoload只能这么命名,spl_auto_register() 能调用不同的函数. 二  自动加载函数原理   通常情况下,一个类的定义都是一个文件,当类与类需要相互引用的时候,就需要include(require)相应的类文件,带来的问题就是

Yii2的深入学习--自动加载机制

Yii2 的自动加载分两部分,一部分是 Composer 的自动加载机制,另一部分是 Yii2 框架自身的自动加载机制. Composer自动加载 对于库的自动加载信息,Composer 生成了一个 vendor/autoload.php 文件.你可以简单的引入这个文件,你会得到一个自动加载的支持. 在之前的文章,入口文件的介绍中,我们可以看到如下内容: // 引入 vendor 中的 autoload.php 文件,会基于 composer 的机制自动加载类 require(__DIR__ .

Yii2的深入学习--自动加载机制(转)

Yii2 的自动加载分两部分,一部分是 Composer 的自动加载机制,另一部分是 Yii2 框架自身的自动加载机制. Composer自动加载 对于库的自动加载信息,Composer 生成了一个 vendor/autoload.php 文件.你可以简单的引入这个文件,你会得到一个自动加载的支持. 在之前的文章,入口文件的介绍中,我们可以看到如下内容: // 引入 vendor 中的 autoload.php 文件,会基于 composer 的机制自动加载类 require(__DIR__ .

php7扩展自动加载类.

使用php扩展来开发框架似乎越来越来成来主流了,如phalcon,鸟哥的yaf.这些框架都以高性能著称,相对纯php使用的框架而,php扩展实现的框架更快,不会带来额外的系统消耗.在php启动时便已加载了框架,并且常驻内存. 几乎所有框架都带自动加载类,以便更好的管理代码.php实现方法这里就不多介绍了,读者可以自行百度.这里将介绍如何在php扩展中实现. 扩展中的实现原理与php实现基本原理一致,都是基于 spl_autoload_register 函数实现. ZEND_METHOD(lxx_

php 自动加载函数、自动加载方法、自动加载类

在PHP开发过程中,如果希望从 外部引入一个class,通常会使用include和require方法,去把定义这个class的文件包含进来.这个在小规模开发的时候,没什么大问 题.但在大型的开发项目中,这么做会产生大量的require或者include方法调用,这样不因降低效率,而且使得代码难以维护,况且 require_once的代价很大. 在PHP5之前,各个PHP框架如果要实现类的自动加载,一般都是按照某种约定自己实现一个遍历 目录,自动加载所有符合约定规则的文件的类或函数. 当然,PHP

Yaf框架下类的自动加载

前面两篇博客分别讲述了PHP自带的类加载和composer中类的自动加载,其实Yaf框架也实现了基于PSR0和PSR4的类的自动加载.根据我对Yaf下类的自动加载方式的理解写下这篇博客.由于接触Yaf框架时间不长,因此如果有不对之处,还望大家不吝指教. 要理解Yaf框架下类的自动加载方式,还是需要PSR0和PSR4规范作为基础,对于PSR0和PSR4的具体规范,本文不做详细解释.Yaf下类的自动加载可以分为全局类和本地类的自动加载.与MVC框架相关的类的自动加载,下面分别做相应的介绍. 一.Ya

【PHP面向对象(OOP)编程入门教程】23.自动加载类 __autoload()函数

很多开发者写面向对象的应用程序时,对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表. 在软件开发的系统中,不可能把所有的类都写在一个PHP文件中,当在一个PHP文件中需要调用另一个文件中声明的类时,就需要通过include把 这个文件引入.不过有的时候,在文件众多的项目中,要一一将所需类的文件都include进来,是一个很让人头疼的事,所以我们能不能在用到什么类的时 候,再把这个类所在的php文件导入呢?这就是我们这里我们要

自动加载类PHP中spl_autoload_register函数的用法

spl_autoload_register(PHP 5 >= 5.1.2) spl_autoload_register — 注册__autoload()函数 说明bool spl_autoload_register ([ callback $autoload_function ] )将函数注册到SPL __autoload函数栈中.如果该栈中的函数尚未激活,则激活它们. 如果在你的程序中已经实现了__autoload函数,它必须显式注册到__autoload栈中.因为 spl_autoload_

PHP面向对象 – 自动加载类

在设计面向对象的程序开发时,通常为每个类的定义都单独建立一个PHP源文件.当你尝试使用一个未定义的类时,php会报一个致命错误.可以用include或require包含一个类所在的源文件,毕竟你知道要用到那个类.如果一个页面需要使用多个类,就不得不在脚本页面开头编写一个长长的包含文件的列表,将本页面需要的类全部包含进来.这样处理不仅繁琐,而且容易出错.  PHP提供了类的自动加载功能,这可以节省编程的时间.当你尝试使用一个PHP没有组织到的类时,它会寻找一个__autoload()的全局函数(不

php中自动加载类_autoload()和spl_autoload_register()实例详解

一._autoload 自动加载类:当我们实例化一个未定义的类时,就会触此函数.到了php7.1以后版本不支持此函数好像抛弃了 新建一个类文件名字自己随便去:news类在auto.php文件里面去实例news类而没有引入该类,可以用_autoload自动加载方法类去处理. news.class.php文件 class news{ function do_new() { echo 'aaa'; } } auto.php文件使用_autoload函数要定义函数体自己去定义 function __au