`

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  
写的太好了,很适合我们这些刚入门的新手看!!谢谢问一句您干编程多长时间了

相关推荐

    Yii 2和PHP Web应用程序开发

    Yii 2和PHP Web应用程序开发

    The Yii Book: Developing Web Applications Using the Yii PHP Framework(Part1&2)

    "The Yii Book: Developing Web Applications Using the Yii PHP Framework" written by Larry Ullman and published over the course of 2012 and 2013. This book, and the selling of it, is a bit of an ...

    yii2-webapps:Yii2 Web应用程序

    Yii2 Web应用程序 Yii2 Web应用程序是一个专用于yii2开发人员社区的入门项目,它具有满足快速创建应用程序需求和额外安全性的功能。该项目的建造: AdminLTE 3 Yii2最新版本 Bootstrap 4 成为开源集体贡献者:安装$ ...

    yii-demo:Yii 3演示应用程序

    Yii框架演示项目 [Yii Framework]是一个现代框架,旨在为您PHP应用程序奠定坚实的基础。 它旨在显示和测试所有Yii功能。 安装 您至少需要PHP 7.4。 克隆此存储库。 在项目根目录中运行composer update 。 运行./...

    yii-passport:使Laravel Passport与Yii一起工作

    Yii护照 安装 :light_bulb: 这是展示如何安装软件包的好地方,请参见下文: 跑步 $ composer require inquid/yii-passport 用法 :light_bulb: 这是显示一些用法示例的好地方! 变更日志 请看看 。 贡献 请看看 。...

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

    yii2.0基础和高级应用程序模板两个,不想使用composer安装yii2.0的,就直接下载这个用吧

    yii2elfinder:yii2elfinder

    该扩展还依赖于最新版本的 ElFinder 2.0-rc1(2012 年 4 月 10 日)。 如何安装: 将此添加到您的 composer.json require 部分 " philippfrenzel/yii2elfinder " : " dev-master " , 之后将以下功能添加到您的...

    yii-simplepie:Yii1.* 的 RSS 解析扩展

    yii-simplepie yii-simplepie 是用于解析 rss 提要的 yii 扩展: 简单派: simplepie 文档: 用法 在 yii 中安装扩展 下载所有文件并放入 yii 扩展文件夹,然后在 config/main.php 中添加以下代码 'simplepie' ...

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

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

    yii-qa:基于Yii2实现的问答系统

    Yii-QA简介(此项目目前已不再维护)感谢选择Yii-QA,基于框架基础实现的问答程序。 #意识到目前的急性时间有限,无法管理太多的额外项目,我准备合并现有手上的项目,集成在一个项目中,感谢支持!!!!!!!请关注:...

    yii-streamlog:将 Yii 1 日志发送到 stdoutstderr - 创建用于与 http 上提供的 php-fpmnginx Docker 堆栈一起使用

    Yii 1 流日志 将 Yii 1 日志发送到 stdout/stderr - 创建用于与提供的 php-fpm/nginx Docker 堆栈一起使用 感谢 Haensel 为! 安装 通过作曲家安装: composer require neam/yii-streamlog:* 或者下载扩展,将src...

    yii-robokassa:用于与 Robokassa 支付服务的 api 配合使用的 Yii 组件

    用于与支付的 api 配合使用的 Yii 组件 安装 从这个 github 存储库下载 yii-robokassa: cd protected/components git clone ... 'sMerchantPass1' => 'pass1' , 'sMerchantPass2' => 'pass

    yii2cms:yii2cms

    Yii 2 Advanced Application Template 是一个骨架 Yii 2 应用程序,最适合开发具有多层的复杂 Web 应用程序。 模板包括三层:前端、后端和控制台,每一层都是一个独立的 Yii 应用程序。 该模板旨在在团队开发环境...

    yii2sly:jquery 狡猾

    yii2sly 这个扩展是惊人的 jquery 滑块“sly”的包装器,可以在这里找到: 请。 仔细查看所有插件选项,可以通过将它们添加到“clientOptions”参数来传递这些选项,如下所示。 可以在此处找到扩展的演示: 安装 ...

    yii2-swoole:完整的解决方案,使yii2-framework与协程在swoole上运行

    yii2-swoole 为赋予 Yii2 框架协程异步能力而生。 后期开发会依赖 去实现功能,相信 Swoft 会是下一代优秀的框架。 此插件基于 swoole (v2.0) 底层实现的协程,改造 Yii2 的核心代码,使开发者无感知,以及在不改动...

    yii-seo:Yii PHP 框架的搜索引擎优化

    yii-seo Yii PHP 框架的搜索引擎优化。 用法 布局中 <?php Yii::app()->controller->widget( 'vendor.crisu83.yii-seo.widgets.SeoHead', array( 'httpEquivs' => array( 'Content-Type' => 'text/html; ...

    yii-ckeditor:简单的 Yii 框架 CKEditor 小部件

    Yii 框架的 CKEditor 小部件 简单的 Yii CKEditor 小部件。 CKEditor - 每个人的 WYSIWYG 编辑器。 小部件生成具有相同属性的 CHtml::activeTextArea。 使用 CKEditor 4+ 版本测试。 安装 将此小部件复制到扩展...

    Yii1LikeUrlRule:在yii2中解析诸如yii1之类的路由的实现

    Yii1LikeUrlRule 此组件使您可以像在yii1中一样使用yii2中的路由,例如site.com/controller/action/param1/valueOfParam1/param2/valueOfParam2

    yii-fullcalendar:Arshaw 的 FullCalendar jQuery 插件的 Yii 扩展

    Yii 1.x 例子 全局组件配置示例: 'components' => [ 'fullcalendar' => [ 'class' => 'ext.yii-fullcalendar.FullCalendar' , 'options' => [ 'buttonText' => [ 'today' => 'Сегодня' , 'week' =>...

    Yii-2.0.14:Yii 2.0.14框架原始码

    Yii 2 Advanced Project Template是最简单的应用程序,最适合开发具有多层的复杂Web应用程序。 该模板包括三层:前端,后端和控制台,每层都是一个单独的Yii应用程序。 该模板旨在在团队开发环境中工作。 它支持在...

Global site tag (gtag.js) - Google Analytics