Как вызвать и вернуть результат цепочки в конструкторе? Здравствуйте.
Разбираю пошагово ActiveRecord и не могу понять как работает данный принцип. Если я в конструкторе возвращаю цепочку, то данных нет. Если извне тяну то все работает.
Как я понимаю проблема в том, что конструктор не может ничего возвращать и нужно вызвать эту цепочку вне конструктора. Не могу понять как это делает ActiveRecord, там уже заплутал в коде их.
Направьте пожалуйста в правильное направление меня.class Member{
static function find($params=null){
return new Query(get_called_class(),$params);
}
}
class Query{
public function __construct($className, $params = []){
if (is_numeric($params)) {
$this->where("id = ?", $params)->one();
}
}
/* where select etc... */
}
$member = Member::find(1); // Нет списка из базы
$member = Member::find()->where("id = ?", 1)->one(); // Есть список из базы

21 Авг 2019 в 07:04
149 +1
0
Ответы
1

Да, вы правы. Проблема заключается в том, что конструктор не может возвращать значения, так как его цель - создать новый объект класса.

В случае с ActiveRecord вам нужно вызывать цепочку методов извне конструктора, так как конструктор должен только инициализировать объект. Вы можете сделать это следующим образом:

class Member{
static function find($params=null){
return new Query(get_called_class(),$params);
}
}
class Query{
private $className;
private $params;
public function __construct($className, $params = []){
$this->className = $className;
$this->params = $params;
}
public function where($condition, ...$params){
// ваш код для добавления условия WHERE
return $this; // возвращаем $this для цепочки вызовов
}
public function one(){
// ваш код для получения одной записи из базы
return $this; // возвращаем $this для цепочки вызовов
}
public function execute(){
// ваш код для выполнения запроса к базе данных
// здесь вы сможете использовать $this->className и $this->params
return $this; // возвращаем $this для цепочки вызовов
}
}
$member = Member::find()->where("id = ?", 1)->one()->execute();

Таким образом, методы where, one и execute возвращают $this, что позволяет дальше продолжать цепочку вызовов. В методе execute вы сможете использовать данные из конструктора $this->className и $this->params.

20 Апр в 13:08
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 83 887 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир