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


Unknown property with class variable PHP in Yii encountered in unit testing

在使用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的一个实例,并通过createCommand函数返回CDbCommand的一个实例。

因为我在类中访问这个属性,所以我应该能够访问字符串变量。为什么这里没有发生这种情况?

完整的错误是

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

无论

是否存在,此行为都会发生
  • 更改SQL字符串
  • 删除第一个换行符

另外,删除$this->会导致undefined variable: insertQuestionSql错误。即使将访问修饰符同时更改为publicprotected

,也会发生这种情况

我不知道这是否对任何人都有帮助,但我想到了一个解决办法。

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

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

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