在单元测试中遇到Yii中的类变量PHP的未知属性

时间:2013-06-06 15:16:29

标签: php yii

在使用SQL编写预处理语句的数据访问对象中,我有几个字符串,其中SQL和绑定变量已初始化。其中之一就是

private $insertQuestionSql = "
INSERT IGNORE INTO bgt.question_models (nodeId, questionId, parentId, state, version,
questionText, userResponseText) 
VALUES (NID, QID, PID, ST, V, QT, URT)";

声明此语句并在与DAO函数相同的类中使用

public function createQuestion(QuestionTemplateModel $qt) {
  //create database connection and initialize transaction
  $connection = Yii::app()->db;
  $transaction = $connection->beginTransaction();

  try {
    $command = $connection->createCommand($this->insertQuestionSql);

在Yii中,$connectionCDbConnection的实例,并通过CDbCommand函数返回createCommand的实例。

由于我在类中访问此属性,因此我应该能够访问字符串变量。为什么这不会发生?

完整错误是

"Unknown property 'insertQuestionSql' for class 'QuestionDAOTest'."

无论

如何,都会发生此行为
  • 更改SQL字符串
  • 删除第一个换行符

此外,删除$this->会导致undefined variable: insertQuestionSql错误。尽管将访问修饰符更改为publicprotected

,仍会发生这种情况

1 个答案:

答案 0 :(得分:0)

我不知道这对任何人都有帮助,但我找到了解决方案。

首先,CDbCommand::bindParam遵循标准的PHP PDOStatement::bindParam()语法,其中要绑定变量的占位符必须具有前缀:。如果没有该前缀,则变量不会绑定到SQL语句。

其次,出于某种原因,尽管在调用变量时使用了private $insertQuestionSql前缀,但在访问类时,$this->总是被发现是一个未知属性。我通过将属性转换为static并通过

进行调用来解决这个问题
$command = $connection->createConnection(QuestionDAO::$insertQuestionSql);