确定在方法链中调用最后一个方法的时间


Determinate when last method has been called in method chaining

我正在为查询构建器使用这样的东西:

$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 方法或类似方法实际执行查询。

对象要销毁时,您可以使用析构函数运行一段代码,但是当语句以随机顺序运行时,这最终会变得一团糟,并且通常不会在脚本结束之前运行。所以不要那样做。