美微书签收藏的网页

美微书签和网页 http://www.phppan.com/2013/05/yii-three-question/ 的作者无关,不对其内容负责。美微书签快照谨为网络故障时之索引,不代表被收藏的网页即时页面。
使用Yii框架中遇到的三个问题 | PHP源码阅读,PHP设计模式,PHP学习笔记,项目管理-胖胖的空间
您的位置:首页 > PHP > 使用Yii框架中遇到的三个问题

使用Yii框架中遇到的三个问题

使用Yii框架中遇到的三个问题

1、main.php文件中欲引入全局变量的问题

还原一下此问题:在Yii框架中,main.php一般会作为整个应用的配置文件,保存Application的各种参数,直接return数组。在使用的过程中,因为main.php文件一定会被Yii提前加载,所以将一些全局性的操作也放在了此文件,加载一些类操作啥的没有什么问题,当有一次加了一个全局变量,并且在其它地方使用global获取全局变量时,发现无论我如何努力都得到的是NULL。各种尝试后,终于,把引入的位置放在入口文件index.php,得以解决。什么原因?我们重现一下Yii的main.php文件加载。如下代码

index.php文件:

 class CApp {
        public function __construct($config) {
            $config = require($config);
        }
    }
 
    $path = "main.php";
    $app = new CApp($path);
 
    global $global;
    var_dump($global);

main.php文件:

 <?php
    $global = array(1, 2, 3);
    return array();

两个文件放在同一目录,直接运行index.php,输出的$global为NULL,如果我们在CApp的构造函数中直接输出$global,则会有结果输出。什么原因?作用域的问题!

当我们在main.php文件中定义了一个变量,虽然是想将其作为全局变量使用,但是当我们在局部的作用域中require时,其仅仅作为一个局部作用域的变量存在。我们在TIPI中有说到函数调用是嵌套的,每个嵌套都会有一个作用域,在这个作用域中的变量仅在当前有效,嵌套结束,变量生命周期结束。

因此,我们如果想把main.php中的全局变量真的作为整个应用的全局变量使用,则需要在入口文件的作用域中require main.php文件。

2、引入第三方扩展时的class_exists问题

Yii框架Yii基于PHP5的autoload机制来提供类的自动加载功能,自动加载器为YiiBase类的静态方法autoload()。当程序中用new创建对象或访问到类的静态成员,PHP将类名传递给类加载器,由类加载器完成类文件的include。但是如果我们引入了第三方扩展,而第三方扩展的命名规则和Yii的不一样,于是我们会经常看到报错说 require XXX 文件失败。如果你在google中搜索“yii framework class_exists”,你会发现Yii框架的作用Xue Qiang有回答使用者可以通过使用类似于: class_exists(’MyClass’, false)的方式。

class_exists函数检查类是否已定义,如果由 class_name 所指的类已经定义,此函数返回 TRUE,否则返回 FALSE。在PHP内核中,此函数会查找当前类表中由 class_name 所指的类是否存在,在查找之前会全部转化为小写,所以不会区分大小写。其第二个参数是指是否使用autoload,默认为使用,此时class_exists函数会先执行autoload,然后再查找执行了autoload后类表中由 class_name 所指的类是否存在。因此我们可以通过设置第二个参数其为FALSE来绕过自动加载。

这可以解决问题,但是如果我们使用的是无法修改的第三方代码呢?怎么办?我自己是简单的hack了下,在调用第三方的操作之就将需要的类给加载了。

后来又采用了另一种解决方案:直接使用Yii:import的第二个参数,强制加载整个目录。

3、Yii的错误日志

问题就不细述了,只是将生产环境的配置整到了开发环境,于是错误看不到了。调整了下日志的规则,就OK了。

Yii对错误日志的处理依赖于PHP的set_error_handler函数和set_exception_handler函数。在CApplication的initSystemHandlers方法中有对这两个函数的处理。

本文地址:使用Yii框架中遇到的三个问题    文章出处:PHP源码阅读,PHP设计模式,PHP学习笔记,项目管理-胖胖的空间

转载请以链接形式注明原始出处和作者,谢绝不尊重版权者抄袭!

3 条留言我要留言

  •   1 - 锅巴  |  2013-05-29 at 12:51 am  

    http://www.thinkinlamp.com
    给你的gmail写信没有回音,我们希望和你聊一下,请有空给我email或者电话
    1861633XXXX 锅巴
    谢谢。

  •   2 - Alonso  |  2013-06-04 at 1:33 pm  

    有给作者 风雪 反馈否?

  •   3 - 麦婉婷  |  2013-07-12 at 5:09 pm  

    您好,我是猎头wanting,现在有一些不错的工作机会想推荐给您,是腾讯子公司招聘PHP高级工程师(team leader),地点在深圳南山区,详情已经发给您的gmail邮箱了,请查看,谢谢。
    公司介绍:
    深圳瓶子科技(Bottle Tech)2011年成立,是一家专注于移动互联网产品开发及运营服务的科技企业。2012年8月在腾讯与360争夺中,最后被腾讯6000万全资收购。
    吸引力:
    1、刷机精灵江湖地位第一,
    2、产品价值-移动互联网系统级入口价值
    3、腾讯收购,没有收入压力,做用户做口碑
    4、近期会并入腾讯一起办公,薪酬福利、发展机制等统一腾讯标准化

必填

必填,绝不公开

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word