使用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的信息请关注信易网络随后的发布,信易网络的官网http://www.ir58.com
使用Yii框架中遇到的三个问题的更多相关文章
- Yii 框架中安装 memcache 及配置和测试
安装php_memcache.dll扩展 1.首先将php_memcache.dll文件放入E:\server\php\ext目录下 (php_memcache.dll下载地址:http://wind ...
- Yii框架中集成phprpc、hprose
在项目开发的过程中有时候会涉及到对外提供接口供第三方程序调用或者是不同程序间需要相互通信,那么最通用的做法是用传统的SOAP方式来实现,用XML的文档格式来作为传输载体.但是这种方式不灵活,支持的数据 ...
- yii框架中关于控制器中filter过滤器和外部action的使用
在yii框架中,控制器的过滤器分为执行前和执行后,这里举例是在执行控制器前的过滤. 需要在components/文件夹下定义公共的TestAction.php文件,并且实现run()方法.这个acti ...
- Yii框架中使用SRBAC作为权限管理模块时遇到的问题
Yii框架中使用SRBAC作为权限管理模块时遇到的问题 看到Yii中提供RBAC的插件,SRBAC,就想用用. 结果按照手册上的安装办法,整来整去,安装完了,可就是进不了权限管理界面. 最后想到, ...
- YII框架中可以使用foreach遍历对象以及可以使用数组形式直接访问对象的原因
YII框架中可以使用foreach遍历对象以及可以使用数组形式直接访问对象的原因在YII框架的使用过程中,我们可以使用foreach直接遍历findAll等方法返回的对象的属性为什么呢?其实这与CMo ...
- YII框架中的srbac权限管理模块的安全与使用(版本是1.1.20)
0x01 前言 srbac的原理: YII框架的srbac模块是一个专门管理权限的一个模块,那它是怎么管理权限的呢.我们知道YII框架的网页显示是由控制器实现的,控制器继承父类CController和 ...
- Yii框架中使用PHPExcel导出Excel文件
最近在研究PHP的Yii框架,很喜欢,碰到导出Excel的问题,研究了一下,就有了下面的方法: 1.首先在config\main.php中添加对PHPExcel的引用,我的方式是这样: 1 2 3 4 ...
- YII框架中php入口文件隐藏
Apache配置修改 主要修改下httpd文件中的两个地方 1.启用mod_rewrite.so模块,在Apache的配置文件中找到如下行,去掉前面的字符"#",保存 #LoadM ...
- 三级联动(在YII框架中)
//三级联动 //数据库代码过多就不上传了 //视图 <div class="area"> <table class="table"&g ...
随机推荐
- unity3d 获取相机视口四个角的坐标
功能:如标题所示,主要考虑用来做3d Plane的自适应屏幕 /// <summary> /// 获取指定距离下相机视口四个角的坐标 /// </summary> /// &l ...
- 揭秘淘宝自主研发的文件系统:TFS
目前,国内自主研发的文件系统可谓凤毛麟角.淘宝在这一领域做了有效的探索和实践,Taobao File System(TFS)作为淘宝内部使用的分布式文件系统,针对海量小文件的随机读写访问性能做了特殊优 ...
- Android实时监听网络状态(2)
在开发android应用时,涉及到要进行网络访问,时常需要进行网络状态的检查,以提供给用户必要的提醒.一般可以通过ConnectivityManager来完成该工作. ConnectivityMana ...
- Android自定义进度条
Android原生控件只有横向进度条一种,而且没法变换样式,比如原生rom的样子很丑是吧,当伟大的产品设计要求更换前背景,甚至纵向,甚至圆弧状的,咋办,比如ok,我们开始吧: 一)变换前背景 先来看看 ...
- oracle数据库导入导出的dmp(转)
window下: imp必须要dba用户,所以用sysdba用户登陆,然后给予chnlmgr用户dba权限 grant connect,resource,dba to chnlmgr; 全部导入 im ...
- careercup-数学与概率 7.5
7.5 在二维平面上,有两个正方形,请找出一条直线,能够将这两个正方形对半分.假定正方形的上下两条边与x轴平行. 解法: 要将两个正方形对半分,这条线必须连接两个正方形的中心点.利用slope=(y1 ...
- [转] Android:微信授权登录与微信分享全解析
https://wohugb.gitbooks.io/wechat/content/qrconnent/refresh_token.html http://blog.csdn.net/xiong_it ...
- 玩转Android之加速度传感器的使用,模仿微信摇一摇
Android系统带的传感器有很多种,最常见的莫过于微信的摇一摇了,那么今天我们就来看看Anroid中传感器的使用,做一个类似于微信摇一摇的效果. OK ,废话不多说,我们就先来看看效果图吧: 当我摇 ...
- 监听列表ListVIew的滑动状态
/*监听列表的滑动状态:暂时用不到 * SCROLL_STATE_FLING 时让图片不显示,提高滚动性能让滚动小姑更平滑 * SCROLL_STATE_IDLE 时显示当前屏幕可见的图片*/ mLi ...
- HDU-1052(贪心策略)
Tian Ji -- The Horse Racing Problem Description Here is a famous story in Chinese history. "Tha ...