我会创建单独的(受保护的)函数,它们返回只需要执行的准备好的语句。
/**
* @returns PDOStatement
*/
protected function prepareStatementForCase1(PDO $dbObject,Object $dataToBind){...}
/**
* @returns PDOStatement
*/
protected function prepareStatementForCase2(PDO $dbObject,Object $dataToBind){...}
然后,我会在外面决定,必须叫哪一个。您可以更轻松地重建、维护和阅读代码。
例子:
class Document{
protected $dbObject;
public function __construct(PDO $dbObject){
$this->dbObject=$dbObject;
}
public function doQuery($paramOne,$paramTwo,...){
$logicalFormulaOne=...; // logical expression here with parameters
$logicalFormulaTwo=...; // logical expression here with parameters
if($logicalForumlaOne){
$dbStatement=$this->prepareStatementForCase1($dataToBind);
}else if($logicalFormuleTwo){
$dbStatement=$this->prepareStatementForCase2($dataToBind);
}
$dbResult=$dbStatement->execute();
}
protected function prepareStatementForCase1(Object $dataToBind){
$dbStatement=$this->dbObject->prepare("query string");
$dbStatement->bindParam(...);
return $dbStatement;
}
}
但是,当您的 PDOResult 对象表示不同类型的数据库元组时,或者当您在其中一种情况下返回更多行时,我不建议这样做。
我通常做的是创建一个代表(在您的示例中)文档的类。只有一个。我可以按其字段插入、删除、选择、修改,并处理一项。当我需要(例如)获取更多它们时,我创建一个新类,例如 DocumentList,它处理文档集合。这个类在获取更多 Document 对象时会给我一个数组。