@dk-web

Как лучше составить конструктор в классе или это должна быть новая функция?

Продолжаю постепенно и плавно втягиваться в ООП... и пытаться отделить 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(
ладно...раз других решений нет - пока сделаю как работает - а то слишком уж застрял
  • Вопрос задан
  • 183 просмотра
Пригласить эксперта
Ответы на вопрос 2
Writerim
@Writerim
Заполнить позже...
class Entity {
  function __set($prop, $value) {
      $this->$prop = $value
     }
}

почитайте про сеттеры и геттеры.
Вы вроде бы передаете данные сеттеру для назначения свойств, но при этом он у вас ничего не делает.
Если у вас от сеттера необходима работа только в назначении свойствам значений без какой нибудь логики, то лучше уберите его.
Ответ написан
@Arik
Метод __set если не ошибаюсь срабатывает, когда нет таких свойств, а у вас они есть. Лучше изучите какой нибудь готовый фреймворк =) По Вакансиям посоветую или YII или laravel.

Идите от обратного - как хотите делать запросы? Допустим у меня примерно так:
$users = Model_User::getTools()->findAll(['status' => 'public']);
На выходе получаем массив из объектов с юзерами
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
Бюро Цифровых Технологий Санкт-Петербург
от 120 000 до 180 000 ₽
03 мая 2024, в 16:26
3000 руб./за проект
03 мая 2024, в 16:09
1200 руб./за проект
03 мая 2024, в 16:06
3000 руб./за проект