Как вызвать и вернуть результат цепочки в конструкторе? Здравствуйте. Разбираю пошагово 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(); // Есть список из базы
Да, вы правы. Проблема заключается в том, что конструктор не может возвращать значения, так как его цель - создать новый объект класса.
В случае с 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.
Да, вы правы. Проблема заключается в том, что конструктор не может возвращать значения, так как его цель - создать новый объект класса.
В случае с 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.