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

时间:2014-12-09 10:10:46

标签: php oop 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() {

    }
}

我该怎么做?

3 个答案:

答案 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之前第一次分配一个函数,然后在每个勾选中 检查代码是否仍然在你的班。一旦你发现它不能执行查询。

令人毛骨悚然,但可能。