代码之家  ›  专栏  ›  技术社区  ›  user1032531

使准备好的语句在方法内保持静态

  •  0
  • user1032531  · 技术社区  · 7 年前

    以下结果是错误的 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 回复  |  直到 7 年前
        1
  •  2
  •   u_mulder    7 年前

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

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