Создание подготовленного утверждения статичным в методе - PullRequest
0 голосов
/ 12 июня 2018

Следующие ошибки: 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 голосов
/ 12 июня 2018

Почему бы не создать защищенное свойство и не инициировать его один раз:

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

use:

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