Как лучше составить конструктор в классе или это должна быть новая функция? Продолжаю постепенно и плавно втягиваться в ООП... и пытаться отделить php от html - может в конце и к mvc приду. Криво, конечно, пока получается и далеко не все, но прогресс есть. На предыдущий свой вопрос толком ни одного ответа не получил, попробую в новом контексте спросить.
Пока есть класс handler (коннекты и что-то вроде CRUD)
Дальше я делаю выборку из БД и FETCH_CLASS. return $stmt->fetchAll(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, $class); //указываю BDAY
Делаю это через пустой класс entity, который мне фильтрует все входящие поля.class Entity {
function __set($prop, $value) {
}
}
Дальше я забиваю класс Bday.class Bday extends Entity {
public $birthday=null;
public $surname=null;
public $age=null;
public $days=null;
// function __construct() {
// // $bday=new DateTime($this->birthday);
// // $today = new DateTime("today");
// // $age =$bday->diff($today)->y;
// // $bday->setDate(date("Y"), $bday->format("m"), $bday->format("d"));
// // // $diff =$bday->diff($today)->d;
// // $this->age=$age;
// // $this->days=$bday->diff($today)->d;
// $this->days="1";
// }
}
и вот закомментированный код не срабатывает( что не так?
приходится делать следующим образом - в обработчике...$data=$obj->db_select($fields, $table, $diff_where, $fieldname=null, $id=null, $order, $class);
foreach ($data as $person) {
$bday=new DateTime($person->birthday);
$today = new DateTime("today");
$age =$bday->diff($today)->y;
$bday->setDate(date("Y"), $bday->format("m"), $bday->format("d"));
$diff =$bday->diff($today)->d;
$person->age=$age;
$person->days=$bday->diff($today)->d;
}
Соответственно вопрос - как мне этот foreach запихнуть в класс, чтобы уже получать готовый экземпляр..
Истина где-то рядом... но...
Much appreciated
UPD:
В общем понятно все... запись в класс при выборке SELECT * и FetchALl это дохлый номер - надо каждый раз передавать в SELECT четкие поля, но это ерунда кмк. Если нужно сделать один! запрос и уже потом разбивать его на разные объекты.. наверное я все-таки не совсем еще понимаю.
Что может быть проще? в таблице 20 полей - забираю все... но в объект person мне нужно положить только 4 определенных... 4 а не 20..
есть еще такой вариант...
в хендлере...
public $params = array('surname','id','country','status' );
return $stmt->fetchAll(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'person',$this->params);
потомclass Entity {
function __construct() {
$this->_attributes = func_get_args();
}
function __set($prop, $value) {
if (in_array($prop, $this->_attributes)) {
$this->$prop = $value;
}
}
}
class Person extends Entity {
public $_attributes;
}
Но тогда в объект добавляется это свойство _attributes(
ладно...раз других решений нет - пока сделаю как работает - а то слишком уж застрял

21 Авг 2019 в 07:06
218 +1
0
Ответы
1

Когда речь идет о том, как лучше организовать конструктор в классе или использовать новую функцию, решение зависит от конкретной ситуации и требований вашего проекта.

Если у вас уже есть класс handler, который занимается CRUD операциями, и у вас есть класс Entity, который фильтрует поля, то имеет смысл использовать конструктор в классе для создания экземпляров объектов, а функцию преобразования данных следует разместить внутри класса или в отдельном классе, если это дает большую целостность.

Чтобы добавить возможность автоматического вычисления возраста и дней до дня рождения при создании экземпляров объектов класса Bday, можно использовать конструктор класса:

class Bday extends Entity {
public $birthday=null;
public $surname=null;
public $age=null;
public $days=null;
function __construct($birthday, $surname) {
$this->birthday = $birthday;
$this->surname = $surname;
$bday = new DateTime($this->birthday);
$today = new DateTime("today");
$this->age = $bday->diff($today)->y;
$bday->setDate(date("Y"), $bday->format("m"), $bday->format("d"));
$this->days = $bday->diff($today)->d;
}
}

При этом в методе обработчике можно будет просто создавать объекты класса Bday и все необходимые вычисления будут автоматически выполнены:

foreach ($data as $person) {
$person = new Bday($person->birthday, $person->surname);
}

Этот подход позволит вам более элегантно управлять созданием объектов и выполнением вычислений при их создании.

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