我正在为查询构建器使用这样的东西:
$queryHandler = new QueryHandler($connection);
$queryHandler->insert("someDataHere")
->into("someTable")
->when("sleep", 1000);
我希望它在该语句上调用最后一个方法时执行查询,在这种情况下是when
函数。
/**
* User: Bas
* Date: 8-12-2014
* Time: 20:11
*/
class QueryFunctions
{
.....
/**
* @param int|float|string| $data The data which is getting inserted
*
* @return $this
*/
public function insert($data) {
....
return $this;
}
public function into($table, $execute) {
....
return $this;
}
public function when($condition, $functionArgument) {
switch($condition) {
case "wait":
.....
break;
}
return $this;
}
/**
* To prevent instantiation
*/
private function __construct() {
}
}
我该怎么做?
答案 0 :(得分:2)
常见的方法是颠倒函数的顺序。写:
$queryHandler->into("someTable")
->when("sleep", 1000)
->insert("someDataHere")
;
insert()
将触发查询。我想除了像worker或crontabs这样的复杂方法之外,PHP中没有别的办法。
答案 1 :(得分:1)
你做不到。您的代码无法知道是否会对该对象进行任何其他调用。使用execute
方法或类似的方法来实际执行查询。
当对象将被销毁时,您可以使用析构函数来运行一段代码,但是当语句以随机顺序运行时,这通常会在脚本结束之前发生,这将导致混乱。所以不要这样做。
答案 2 :(得分:1)
我不认为你可以知道链条已经结束了。别忘了你的代码直接等于:
$queryHandler = new QueryHandler($connection);
$queryHandler->insert("someDataHere");
$queryHandler->into("someTable");
$queryHandler->when("sleep", 1000);
即使这样的逻辑是可能的,也可能并不总是方便。当您想要稍后执行准备好的查询 时,您可能会遇到这种情况。
而是使用另一种方法发送查询:
$queryHandler->insert("someDataHere")
->into("someTable")
->when("sleep", 1000);
$queryHandler->start(); //will execute conditions (such as sleep) and then send query
在PHP中使用tick callback
可能会出现令人毛骨悚然的变通方法。 可以在返回$this
之前第一次分配一个函数,然后在每个勾选中 检查代码是否仍然在你的班。一旦你发现它不能执行查询。
令人毛骨悚然,但可能。