我在
PHP中创建一个QueryBuilder,数据库事务需要我创建多个查询,这会导致问题,因为第一个查询之后的任何查询都会被附加并堆叠到类中的$query属性.
为了解决这个问题,我可以为每个查询创建新的QueryBuilder对象,如下所示
$QB1 = new QB()
$QB1->select()
->from()
->where()
...
doSomething($QB1);
$QB2 = new QB()
$QB2->join()
->where()
...
doSomething($QB2);
我还可以创建一个方法来重置当前类属性,这将删除第一个查询.
$QB = new QB();
$QB->select()
->from()
->where()
...
doSomething($QB);
$QB->reset();
$QB->join()
->where()
...
doSomething($QB);
我确定这种类型的问题出现在许多OOP应用程序中,在这种情况下,一般情况下,正确的做法是什么?重置/清除还是新建? – 也许还有另一种方法可以解决它?
期待任何回复.
最佳答案 这取决于对象的创建方式,但重置对象的主要思想是清除其内部状态.
例如.
>如果实例化了注入了特定初始状态的对象,则reset方法可能需要接受构造函数参数
>或者使用默认值填充初始状态,reset方法应该能够将它们设置为默认值
但在php clone
关键字中确实存在于此目的.
你应该使用__clone()
魔法来重置对象的内部状态,比如
class QB {
protected $sql;
protected $params;
public function __construct(){};
public function select(){};
function __clone(){
$this->sql = NULL;
$this->params = NULL;
}
}
$qb = new QB()
$qb->select()
->from()
->where()
...
doSomething($qb);
$qb2 = clone $qb; // you'll get the shallow copy of the $qb, with it initial state
或者如果你想要重置方法,
class QB {
protected $sql;
protected $params;
public function __construct(){};
public function select(){};
public function reset(){
$this->sql = NULL;
$this->params = NULL;
return $this;
}
}
$qb = new QB()
$qb->select()
->from()
->where()
...
doSomething($qb);
$qb2 = $qb->reset()->select()->from()->where();
doSomething($qb2);
编辑
正如我所提到的,clone将创建原始对象的浅表副本
$qb = clone $qb; // creates a new copy and assign it to $qb
但是这将涉及新的对象实例化
但是在reset方法中,不会有新的对象实例化,而是要设置内部状态.您实际上不需要将其分配给新变量,您可以
$qb->reset()->select()->from()->where();
doSomething($qb);
希望这可以帮助