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