Как вызвать и вернуть результат цепочки в конструкторе? Здравствуйте.
Разбираю пошагово 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
172 +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 Апр 2024 в 13:08
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир