Я использую что-то вроде этого для построителя запросов:
$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 = 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
Существует жуткий возможный обходной путь с использованием tick callback
в PHP. Вы мог назначить функцию в первый раз до возврате $this
а потом проверь, в каждом тике находится ли код в области действия вашего класса. Как только вы узнаете, что это не так, вы можете выполнить запрос.
Жутко, но возможно.
Обычный способ — инвертировать порядок функций. Написать:
$queryHandler->into("someTable")
->when("sleep", 1000)
->insert("someDataHere")
;
insert()
вызовет запрос. Я думаю, что в PHP нет другого пути, кроме сложных методов, таких как рабочие или crontabs.
Ты не можешь Ваш код не может знать, будут ли какие-либо другие вызовы объекта. Используйте execute
метод или что-то подобное, чтобы фактически выполнить запрос.
Вы можете использовать деструктор для запуска фрагмента кода, когда объект будет уничтожен, но это приведет к беспорядку, когда операторы будут выполняться в произвольном порядке, и обычно не раньше, чем завершится сценарий. Так что не делай этого.