我有一个PHP类,它使用MySQLi预处理语句来加载这样的数据:
class MyClass {
public $a, $bla;
public load(&$mysqli) {
$s = $mysqli->prepare('SELECT a FROM x WHERE y = ?');
$s->bind_param('s', $this->bla);
$s->bind_result($this->a);
if($s->execute()) {
if($s->fetch()) {
$s->free_result();
}
}
}
}
然而,这意味着对于我调用load()函数的MyClass的每个对象,我将准备一个新的语句,这似乎是低效的。
我重复使用准备好的陈述的想法是做这样的事情:
class MyClass {
public $a, $bla;
private static $my_s;
public load(&$mysqli) {
if(!self::$my_s) {
self::$my_s = $mysqli->prepare('SELECT a FROM x WHERE y = ?');
}
$s = self::$my_s;
$s->bind_param('s', $this->bla);
$s->bind_result($this->a);
if($s->execute()) {
if($s->fetch()) {
$s->free_result();
}
}
}
}
因此将语句保存为静态成员变量。这样,我应该在第一次调用load()时准备语句,之后它将被同一个类的所有对象重用。
这是一种有效的方法吗?还有更好的方法吗?