使用YII的时候,我在一个model中声明了一个常量:
const POST_STATUS_DRAFT = "drapt";
然后在用YII的CDBCriteria中使用了它(如下所示),结果一直报错。
$criteria = new CDBCriteria;
$criteria->addcondition("post_status not like :postStatus");
$criteria->params[':postStatus'] = POST_STATUS_DRAFT;
报错内容如下:
The system is unable to find the requested action "error". (D:\wamp\Apache24\htdocs\yii\framework\web\CController.php:483)
#0 D:\wamp\Apache24\htdocs\yii\framework\web\CController.php(270): CController->missingAction('error')
#1 D:\wamp\Apache24\htdocs\yii\framework\web\CWebApplication.php(282): CController->run('error')
#2 D:\wamp\Apache24\htdocs\yii\framework\base\CErrorHandler.php(368): CWebApplication->runController('site/error')
#3 D:\wamp\Apache24\htdocs\yii\framework\base\CErrorHandler.php(296): CErrorHandler->renderError()
#4 D:\wamp\Apache24\htdocs\yii\framework\base\CErrorHandler.php(133): CErrorHandler->handleError(Object(CErrorEvent))
#5 D:\wamp\Apache24\htdocs\yii\framework\base\CApplication.php(824): CErrorHandler->handle(Object(CErrorEvent))
#6 D:\wamp\Apache24\htdocs\blog\protected\models\Posts.php(238): CApplication->handleError(8, 'Use of undefine...', 'D:\\wamp\\Apache2...', 238, Array)
#7 D:\wamp\Apache24\htdocs\blog\protected\controllers\PostsController.php(148): Posts::getPostsByType(NULL)
#8 [internal function]: PostsController->actionIndex(NULL)
#9 D:\wamp\Apache24\htdocs\yii\framework\web\actions\CAction.php(109): ReflectionMethod->invokeArgs(Object(PostsController), Array)
#10 D:\wamp\Apache24\htdocs\yii\framework\web\actions\CInlineAction.php(47): CAction->runWithParamsInternal(Object(PostsController), Object(ReflectionMethod), Array)
#11 D:\wamp\Apache24\htdocs\yii\framework\web\CController.php(308): CInlineAction->runWithParams(Array)
#12 D:\wamp\Apache24\htdocs\yii\framework\web\filters\CFilterChain.php(133): CController->runAction(Object(CInlineAction))
#13 D:\wamp\Apache24\htdocs\yii\framework\web\filters\CFilter.php(40): CFilterChain->run()
#14 D:\wamp\Apache24\htdocs\yii\framework\web\CController.php(1145): CFilter->filter(Object(CFilterChain))
#15 D:\wamp\Apache24\htdocs\yii\framework\web\filters\CInlineFilter.php(58): CController->filterAccessControl(Object(CFilterChain))
#16 D:\wamp\Apache24\htdocs\yii\framework\web\filters\CFilterChain.php(130): CInlineFilter->filter(Object(CFilterChain))
#17 D:\wamp\Apache24\htdocs\yii\framework\web\CController.php(291): CFilterChain->run()
#18 D:\wamp\Apache24\htdocs\yii\framework\web\CController.php(265): CController->runActionWithFilters(Object(CInlineAction), Array)
#19 D:\wamp\Apache24\htdocs\yii\framework\web\CWebApplication.php(282): CController->run('index')
#20 D:\wamp\Apache24\htdocs\yii\framework\web\CWebApplication.php(141): CWebApplication->runController('posts/index')
#21 D:\wamp\Apache24\htdocs\yii\framework\base\CApplication.php(184): CWebApplication->processRequest()
#22 D:\wamp\Apache24\htdocs\blog\index.php(13): CApplication->run()
#23 {main}
报错内容太长,当时不想看,自己去找错,方向一直在YII框架的CDBCriteria类使用错误上,结果找了半天才发现是类常量的问题。代码修改成下面的就可以了:
$criteria = new CDBCriteria;
$criteria->addcondition("post_status not like :postStatus");
$criteria->params[':postStatus'] = self::POST_STATUS_DRAFT;//加上了self::
最后顺便温习了PHP中常量的知识:
1、常量定义
定义格式如下:
boolean define(string name, mixed value [, bool case_insensitive]);
name:常量名,一般字母全部大写,单词之间用下划分割开。默认区分大小写,可以通过case_insensitive来设置。
value:常量的值
case_insensitive:设置是否区分大小写,case_insensitive为true时表示不区分大小写
例子:
define("CON_INT",29);
2、常量使用
例子:
echo CON_INT;
3、在类中定义和使用常量
class MyClass{
const CON_INT = 12;//类中定义常量
public function getCon(){
echo self::CON_INT;//类中使用常量
}
}
echo MyClass::CON_INT;//类外使用常量
4、注意事项
1)常量一旦定义,就不能取消定义。
2)常量作用域是全局的。
3)在类中定义常量一定要用const,不能用define
4)在类中使用常量一定要加上“self::”,类外使用要用“类名 ::”。