我正在为查询构建器使用这样的东西:
$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() {
}
}
我该怎么做?
一种常见的方法是反转函数的顺序。写:
$queryHandler->into("someTable")
->when("sleep", 1000)
->insert("someDataHere")
;
insert()
将触发查询。我想在 PHP 中除了像 worker 或 crontabs 这样的复杂方法之外没有其他方法。
不...通常
我不认为你能知道链条已经结束了。不要忘记你的代码直接等于:
$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
之前第一次分配一个函数,然后在每次勾选中检查代码是否仍在类的范围内。一旦发现不是,您就可以执行查询。
令人毛骨悚然,但有可能。
你不能。您的代码无法知道是否会对对象进行任何其他调用。使用 execute
方法或类似方法实际执行查询。
对象要销毁时,您可以使用析构函数运行一段代码,但是当语句以随机顺序运行时,这最终会变得一团糟,并且通常不会在脚本结束之前运行。所以不要那样做。