在方法中使预处理语句静态化

时间:2018-06-12 20:03:17

标签: php pdo static prepared-statement

以下结果导致错误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);

1 个答案:

答案 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]);
}