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

使用Yii框架中遇到的三个问题
一、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文件:
$global = array(1, 2, 3); return array();


两个文件放在同一目录,直接运行index.php,输出的$global为NULL,若是咱们在CApp的构造函数中直接输出$global,则会有结果输出。什么缘由?做用域的问题!
当咱们在main.php文件中定义了一个变量,虽然是想将其做为全局变量使用,可是当咱们在局部的做用域中require时,其仅仅做为一个局部做用域的变量存在。咱们在TIPI中有说到函数调用是嵌套的,每一个嵌套都会有一个做用域,在这个做用域中的变量仅在当前有效,嵌套结束,变量生命周期结束。
所以,咱们若是想把main.php中的全局变量真的做为整个应用的全局变量使用,则须要在入口文件的做用域中require main.php文件。
二、引入第三方扩展时的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的第二个参数,强制加载整个目录。
三、Yii的错误日志
问题就不细述了,只是将生产环境的配置整到了开发环境,因而错误看不到了。调整了下日志的规则,就OK了。
Yii对错误日志的处理依赖于PHP的set_error_handler函数和set_exception_handler函数。在CApplication的initSystemHandlers方法中有对这两个函数的处理。
相关文章
相关标签/搜索