За последние 24 часа нас посетили 10385 программистов и 905 роботов. Сейчас ищут 267 программистов ...

Правильно ли нашёл решение?

Тема в разделе "PHP для новичков", создана пользователем Вероломство, 3 авг 2022.

  1. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    515
    Симпатии:
    17
    PHP:
    1. abstract class ActiveRecord
    2. {
    3.     private $PDO;
    4.     public $id;
    5.     public $originalProperties = [];
    6.  
    7.     function __construct(PDO $PDO)
    8.     {
    9.         $this->PDO = $PDO;
    10.  
    11.         $this->originalProperties = $this->getProperties();
    12.     }
    13.  
    14.     private function getProperties()
    15.     {
    16.         return array_filter(get_object_vars($this), function ($property) {
    17.             return !is_object($property) && !is_array($property);
    18.         });
    19.     }
    20.  
    21.     abstract protected function getTableName();
    22.  
    23.     public function query($sql, $params = [], $class = '')
    24.     {
    25.         $sth = $this->PDO->prepare($sql);
    26.         $sth->execute($params);
    27.  
    28.         return $class ? $sth->fetchAll(PDO::FETCH_CLASS, $class, [$this->PDO]) : $sth;
    29.     }
    30. }
    Что не нравится? Не нравится то, что экземпляр ActiveRecord содержит свойство-объект PDO и мне чтобы заполнить originalProperties нужно проверять ДОПОЛНИТЕЛЬНО, не является ли свойство объектом.

    Переделал так:

    PHP:
    1. abstract class ActiveRecord
    2. {
    3.     private static $PDO;
    4.     public $id;
    5.     public $originalProperties = [];
    6.  
    7.     function __construct(PDO $PDO)
    8.     {
    9.         self::$PDO = $PDO;
    10.  
    11.         $this->originalProperties = $this->getProperties();
    12.     }
    13.  
    14.     private function getProperties()
    15.     {
    16.         return array_filter(get_object_vars($this), function ($property) {
    17.             return !is_array($property);
    18.         });
    19.     }
    20.  
    21.     abstract protected function getTableName();
    22.  
    23.     public function query($sql, $params = [], $class = '')
    24.     {
    25.         $sth = self::$PDO->prepare($sql);
    26.         $sth->execute($params);
    27.  
    28.         return $class ? $sth->fetchAll(PDO::FETCH_CLASS, $class, [self::$PDO]) : $sth;
    29.     }
    30. }
    то есть убрал объект в статику

    Я всех обманул? :)

    Решается так?
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.349
    Симпатии:
    1.688
    По идее, надо скрыть SQL за реализацией какого-нибудь Query-интерфейса и методами самой модели. В таком виде большого удобства это всё не даст.
     
    Вероломство нравится это.