在方法中使准备好的语句静态化

Making prepared statement static within method

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

为什么不创建一个受保护的 属性 并初始化一次:

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