PHP: abstract class ActiveRecord { private $PDO; public $id; public $originalProperties = []; function __construct(PDO $PDO) { $this->PDO = $PDO; $this->originalProperties = $this->getProperties(); } private function getProperties() { return array_filter(get_object_vars($this), function ($property) { return !is_object($property) && !is_array($property); }); } abstract protected function getTableName(); public function query($sql, $params = [], $class = '') { $sth = $this->PDO->prepare($sql); $sth->execute($params); return $class ? $sth->fetchAll(PDO::FETCH_CLASS, $class, [$this->PDO]) : $sth; } } Что не нравится? Не нравится то, что экземпляр ActiveRecord содержит свойство-объект PDO и мне чтобы заполнить originalProperties нужно проверять ДОПОЛНИТЕЛЬНО, не является ли свойство объектом. Переделал так: PHP: abstract class ActiveRecord { private static $PDO; public $id; public $originalProperties = []; function __construct(PDO $PDO) { self::$PDO = $PDO; $this->originalProperties = $this->getProperties(); } private function getProperties() { return array_filter(get_object_vars($this), function ($property) { return !is_array($property); }); } abstract protected function getTableName(); public function query($sql, $params = [], $class = '') { $sth = self::$PDO->prepare($sql); $sth->execute($params); return $class ? $sth->fetchAll(PDO::FETCH_CLASS, $class, [self::$PDO]) : $sth; } } то есть убрал объект в статику Я всех обманул? Решается так?
По идее, надо скрыть SQL за реализацией какого-нибудь Query-интерфейса и методами самой модели. В таком виде большого удобства это всё не даст.