以下结果导致错误PHP Fatal error: Constant expression contains invalid operations
。我显然可以创建一种新方法updateArrayOfNodes()
,但是,我并不关心边际性能提升。我认为重复创建准备好的声明的性能是一个更大的优惠。
如何在方法中重用预处理语句?
class mapper
{
public function update(Entities\Node $node){
static $stmt=$this->pdo->prepare('UPDATE series SET name=:name, position=:position WHERE id=:id');
return $stmt->execute(['name'=>$node->name, 'position'=>$node->position, 'id'=>$node->id]);
}
}
$mapper=new mapper();
foreach($arr as $node) $mapper->update($node);
答案 0 :(得分:2)
为什么不创建一个受保护的属性并初始化它:
class mapper
{
protected $stmt;
public function update(Entities\Node $node){
if (!$this->stmt) {
$this->stmt = $this->pdo->prepare('UPDATE series SET name=:name, position=:position WHERE id=:id');
}
return $this->stmt->execute(['name'=>$node->name, 'position'=>$node->position, 'id'=>$node->id]);
}
}
或者更进一步 - 创建像updateBatch()
这样的方法并在那里传递数组,而不是:
$mapper=new mapper();
foreach($arr as $node) $mapper->update($node);
使用:
$mapper=new mapper();
$mapper->updateBatch($arr);
静态变量的用法应该是这样的:
public function update(Entities\Node $node){
static $stmt;
if (!$stmt) {
$stmt=$this->pdo->prepare('UPDATE series SET name=:name, position=:position WHERE id=:id');
}
return $stmt->execute(['name'=>$node->name, 'position'=>$node->position, 'id'=>$node->id]);
}