`

Yii分析1:web程序入口(1)

阅读更多

以下分析基于Yii v1.0.6

 

Yii_PATH表示framework的路径

 

通常使用Yii框架的index.php程序如下:

// change the following paths if necessary
$yii    = dirname(__FILE__).'/protected/lib/Yii/framework/yii.php';
$config = dirname(__FILE__).'/protected/config/main.php';

// remove the following line when in production mode
defined('YII_DEBUG') or define('YII_DEBUG',true);

require_once $yii;
$app = Yii::CreateWebApplication($config);
$app->run();

 

我们来看一下Yii::CreateWebApplication的过程:

 

Yii其实是YiiBase的helper,因此我们实际查看的是YiiBase::CreateWebApplication

 

Yii_PATH/YiiBase.php:

 

class YiiBase
{
……
    public static function createWebApplication($config=null)
    {
        return new CWebApplication($config);
    }
……
    //自动类加载函数
    public static function autoload($className)
    {

        // use include so that the error PHP file may appear
        if(isset(self::$_coreClasses[$className]))
            include(YII_PATH.self::$_coreClasses[$className]);
        else if(isset(self::$_classes[$className]))
            include(self::$_classes[$className]);
        else
        {
            include($className.'.php');
            return class_exists($className,false) || interface_exists($className,false);
        }
        return true;
    }
……

    //核心类列表
    private static $_coreClasses=array(
        'CApplication' => '/base/CApplication.php',
        'CApplicationComponent' => '/base/CApplicationComponent.php',
        'CBehavior' => '/base/CBehavior.php',
        ……
    );

}
//注册自动类加载函数
spl_autoload_register(array('YiiBase','autoload'));
require(YII_PATH.'/base/interfaces.php');

 

这里返回的是一个CWebApplication的对象,

 

Yii_PATH/web/CWebApplication.php

class CWebApplication extends CApplication
{
……
}

 CWebApplication继承自CApplication,没有自定义的constructor,因此我们继续查看CApplication的constructor:

 

Yii_PATH/base/CApplication.php

 

abstract class CApplication extends CModule
{
……
    public function __construct($config=null)
    {
        Yii::setApplication($this);
        // set basePath at early as possible to avoid trouble
        if(is_string($config))
            $config=require($config);
        if(isset($config['basePath']))
        {
            $this->setBasePath($config['basePath']);
            unset($config['basePath']);
        }
        else
            $this->setBasePath('protected');
        Yii::setPathOfAlias('application',$this->getBasePath());
        Yii::setPathOfAlias('webroot',dirname($_SERVER['SCRIPT_FILENAME']));

        $this->preinit();

        $this->initSystemHandlers();
        $this->registerCoreComponents();

        $this->configure($config);
        $this->attachBehaviors($this->behaviors);
        $this->preloadComponents();

        $this->init();
    }
……
}

 这里,做了很多工作,我们来慢慢分析:

 

Yii::setApplication($this);

 对应代码如下:

    public static function setApplication($app)
    {
        if(self::$_app===null || $app===null)
            self::$_app=$app;
        else
            throw new CException(Yii::t('yii','Yii application can only be created once.'));
    }

 这里只是set一下application的名称,ok,继续:

        if(is_string($config))
            $config=require($config);
        if(isset($config['basePath']))
        {
            $this->setBasePath($config['basePath']);
            unset($config['basePath']);
        }
        else
            $this->setBasePath('protected');

 这里主要是将createWebApplication时穿过来的配置文件require了一下,然后拿到配置项中的basePath,设置成员变量:

    public function setBasePath($path)
    {
        if(($this->_basePath=realpath($path))===false || !is_dir($this->_basePath))
            throw new CException(Yii::t('yii','Application base path "{path}" is not a valid directory.',
                array('{path}'=>$path)));
    }

 之后:

        Yii::setPathOfAlias('application',$this->getBasePath());
        Yii::setPathOfAlias('webroot',dirname($_SERVER['SCRIPT_FILENAME']));

 通过下面的函数设置路径的别名:

    public static function setPathOfAlias($alias,$path)
    {
        if(empty($path))
            unset(self::$_aliases[$alias]);
        else
            self::$_aliases[$alias]=rtrim($path,'\\/');
    }

 保存在$_aliases数组中,接下来是一些初始化的工作(未完待续):

$this->preinit();

 调用的是Yii_PATH/base/CModule.php中的一个空函数,用于初始化模块(子类覆盖)

protected function preinit(){
}

 

接下篇: Yii分析1:web程序入口(2)

 

 

8
7
分享到:
评论
2 楼 silentime 2012-09-20  
浮若尘 写道
写的太好了,很适合我们这些刚入门的新手看!!谢谢问一句您干编程多长时间了

算实习的话5年了
1 楼 浮若尘 2012-09-15  
写的太好了,很适合我们这些刚入门的新手看!!谢谢问一句您干编程多长时间了

相关推荐

    Yii2的基本应用程序模板 yii-basic-app-2.0.12

    - `config`:包含应用程序的配置文件,如`web.php`(Web应用的入口配置)和`console.php`(控制台应用的配置)。 - `controllers`:存放控制器类,负责处理用户请求和生成响应。 - `models`:存放数据模型类,...

    Yii框架快速入门

    ### Yii框架快速入门详解 #### 一、Yii框架概述 ...通过深入理解其核心概念,如入口脚本、应用程序以及MVC架构的运用,开发者可以充分利用Yii的强大功能,快速构建出稳定、高效且可维护的Web应用。

    yii2.0基础高级应用程序模板

    Yii 2.0 是一款基于组件的高性能 PHP 框架,用于开发 Web 2.0 应用程序。此框架提供了丰富的特性,包括 MVC(模型-视图-控制器)架构模式、活动记录(Active Record)、依赖注入(Dependency Injection)、单元测试...

    php yii源码分析

    入口文件是每个 Web 应用程序的起点,对于 Yii 而言,`index.php` 文件是应用的入口。在这个文件中,Yii 的主要配置和初始化过程发生。例如,`$yii` 变量指向了框架的核心入口点 `yii.php`,而 `$config` 指向应用...

    YII2框架代码

    2. 高级版YII2框架:适用于大型复杂的Web应用程序,提供了更清晰的模块化结构和多应用支持。高级版分为前端和后端两个独立的应用,每个应用都有自己的入口脚本、控制器、模型和视图,以及独立的配置,可以更好地分离...

    Yii_PHP_框架分析

    Yii PHP 框架分析 Yii 是一个高性能的,基于组件的 PHP 框架,用于开发 Web2.0 应用程序。本分析将深入探讨 Yii 的基本操作,包括...通过深入理解这些基础知识,开发者能够更好地利用 Yii 构建高质量的 Web 应用程序。

    yii-usermanager:基于 Yii 框架构建的用户管理应用程序

    - `web/`:Web 根目录,包含入口脚本、静态资源(CSS、JS 文件)等。 - `.gitignore`:定义了版本控制系统忽略的文件和目录。 - `composer.json`:定义项目依赖和元数据,用于 Composer 包管理。 - `README.md`:...

    yii1.1版本资料整理

    1. 高重用性:Yii框架设计了大量可重用的组件和功能模块,以便开发者可以简单地复用这些模块来快速构建应用程序。 2. 高效性:Yii使用懒加载和数据缓存等技术手段,减少了不必要的资源消耗,显著提高了应用程序的...

    新下载的yii2,yii framework

    Yii2 是一个高性能的、基于组件的 PHP 框架,用于开发Web应用程序。它遵循“简洁即高效”的设计理念,提供了丰富的特性,如MVC(Model-View-Controller)、I18N/L10N(国际化和本地化)、缓存管理、数据库抽象层以及...

    Yii_PHP_框架源码分析.pdf

    Yii是一个基于PHP语言的开源Web应用框架,提供了许多便捷的功能和工具来帮助开发者快速构建Web应用程序。本文主要对Yii框架的源码进行分析,探究其内部机制和实现原理。 1. 启动机制 Yii框架的启动机制是通过index...

    Yii框架执行流程及部分源码分析

    1. **程序结构及配置** Yii的项目结构通常包含以下关键部分: - `protected`:存放应用的核心代码,如模型、控制器、配置文件等。 - `runtime`:运行时目录,存储日志、缓存文件等。 - `webroot`:网站的公共...

    yii框架中文手册教程

    1. 性能优越:Yii框架采用了各种优化技术,保证了Web应用的高性能,尤其在处理大量数据和高流量的Web应用时表现优异。 2. 组件化设计:Yii框架采用基于组件的设计模式,开发者可以通过复用组件快速组装出复杂的Web...

    yii框架教程

    ### Yii 框架教程详解 ...掌握了这些基础知识后,开发者可以更有效地利用 Yii 构建稳定、高效的 Web 应用程序。未来还可以深入研究更多高级特性,如模块化开发、安全性强化等,以满足更复杂的应用场景需求。

    Yii框架学习笔记.pdf

    1. **项目入口脚本**:在Yii框架中,项目的入口脚本通常命名为index.php,该脚本包含引导文件yii.php和配置文件main.php。index.php脚本会设置两个关键常量YII_DEBUG和YII_TRACE_LEVEL,分别用于控制调试模式的开启...

    Yii Blog Book

    - **框架概念**:Yii是一个高性能的PHP框架,专为快速开发安全且健壮的Web应用程序而设计。它支持敏捷开发和测试驱动开发,并且具有丰富的功能集,如缓存支持、错误处理、认证管理等。 - **安装过程**: - **下载*...

    Yii教案素材整理

    它遵循MVC(模型-视图-控制器)设计模式,使得开发者能够快速构建和维护复杂的Web应用程序。Yii框架以其高性能、安全性、可定制性而受到广大开发者的青睐。本篇教案素材整理详细讲解了Yii框架的基本概念、安装方法...

    YII快速入门教程

    - **作用**: 初始化环境变量、加载配置文件、创建Web应用程序实例并运行。 - **示例代码**: ```php $yii = dirname(__FILE__) . '/../../framework/yii.php'; // Yii框架位置 $config = dirname(__FILE__) . '/...

    YII框架应用

    本文档将详细介绍如何在本地环境中搭建并使用YII框架来创建一个简单的Web应用程序。 #### 二、安装与配置 ##### 2.1 环境检查 在开始安装YII之前,需要确保服务器环境满足YII的最低要求。根据文档提供的信息,...

Global site tag (gtag.js) - Google Analytics