Как лучше составить конструктор в классе или это должна быть новая функция? Продолжаю постепенно и плавно втягиваться в ООП... и пытаться отделить 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( ладно...раз других решений нет - пока сделаю как работает - а то слишком уж застрял
Когда речь идет о том, как лучше организовать конструктор в классе или использовать новую функцию, решение зависит от конкретной ситуации и требований вашего проекта.
Если у вас уже есть класс 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); }
Этот подход позволит вам более элегантно управлять созданием объектов и выполнением вычислений при их создании.
Когда речь идет о том, как лучше организовать конструктор в классе или использовать новую функцию, решение зависит от конкретной ситуации и требований вашего проекта.
Если у вас уже есть класс 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);
}
Этот подход позволит вам более элегантно управлять созданием объектов и выполнением вычислений при их создании.