在方法中使准备好的语句静态化
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]);
}
以下导致错误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]);
}