Добрый день. Прошу помощи. Только начал вникать в ООП. Необходим класс для сущностей которые по факту представляют из себя набор данных из БД (сейчас MySQL, в дальнейшем источник данных может измениться). На основе нескольких вариантов подхода к данной задаче из различных источников в интернет родился класс, точнее набор классов для казалось бы простой задачи выдернуть данные для конструктора класса из БД. Вопрос к практикам, на сколько оправдан данный вариант реализации или эта задача должна решаться иным способом? Base.php PHP: declare(strict_types=1); namespace Portal; class Base { private int $id; private string $fullName; private string $shortName; private int $hidden; public function __construct(int $id, string $fullName, string $shortName, int $hidden){ $this->id = $id; $this->fullName = $fullName; $this->shortName = $shortName; $this->hidden = $hidden; } public static function fromState(array $state): Base{ return new self( $state['id'], $state['fullName'], $state['shortName'], $state['hidden'], ); } public function id(){ return $this->id; } public function fullName(){ return $this->fullName; } public function shortName(){ return $this->shortName; } public function isHidden(){ return $this->hidden; } IBaseStorage.php PHP: declare(strict_types=1); namespace Portal; interface IBaseStorage{ public function findById(int $id); public function findByName(string $name); public function findByShortName(string $name); public function save(string $shortName, string $fullName, int $hidden); public function update(int $id, string $fullName, string $shortName, int $hidden); BaseMapper.php PHP: declare(strict_types=1); namespace Portal; use InvalidArgumentException; class BaseMapper{ public function __construct(IBaseStorage $adapter){ $this->adapter = $adapter; } public function findById(int $id): Base{ $result = $this->adapter->findById($id); if (!$result): throw new InvalidArgumentException("Record not found (params: id#$id)"); endif; return $this->mapRowToBase($result); } public function findByFullName(string $fullName): Base{ $result = $this->adapter->findByName($fullName); if (!$result): throw new InvalidArgumentException("Record not found (params: fullName#$fullName)"); endif; return $this->mapRowToBase($result); } public function findByShortName(string $shortName): Base{ $result = $this->adapter->findByShortName($shortName); if (!$result): throw new InvalidArgumentException("Record not found (params: shortName#$shortName)"); endif; return $this->mapRowToBase($result); } public function save(string $shortName, string $fullName, int $hidden): Base{ $data = $this->adapter->findByShortName($shortName); if($data === false): $result = $this->adapter->save($shortName, $fullName, $hidden); if (!$result): throw new InvalidArgumentException("Record not created, arguments error (params: fullName#$fullName, shortName#$shortName, hidden#$hidden"); endif; else: throw new InvalidArgumentException("Record not created, record already exists, shortName must be unique (params: fullName#$fullName, shortName#$shortName, hidden#$hidden"); endif; return $this->mapRowToBase($result); } public function update(Base $instance, string $shortName, string $fullName, int $hidden): Base{ $id = $instance->id(); $data = $this->adapter->findByShortName($shortName); if((is_array($data) && ($data['id'] == $id)) || ($data === false)): $result = $this->adapter->update($id, $shortName, $fullName, $hidden); if ($result === false): throw new InvalidArgumentException("Record not update, arguments error (params: id#$id, fullName#$fullName, shortName#$shortName, hidden#$hidden"); endif; else: throw new InvalidArgumentException("Record not update, record already exists (params: id#$id, fullName#$fullName, shortName#$shortName, hidden#$hidden"); endif; return $this->mapRowToBase($result); } private function mapRowToBase(array $row): Base{ return Base::fromState($row); } PdoBaseStorage.php PHP: declare(strict_types=1); namespace Portal; use PDO; use \Db; use InvalidArgumentException; class PdoBaseStorage implements IBaseStorage { private $dbConnect; public function __construct($db){ $this->dbConnect = $db; } public function findById(int $id){ $sql = "SELECT `id`, `name`, `short_name`, `hidden` FROM `portal_base` WHERE `id` = :id LIMIT 1"; $stmnt = $this->dbConnect->prepare($sql); $stmnt->bindParam(":id", $id, PDO::PARAM_INT); $stmnt->execute(); $result = $stmnt->fetch(PDO::FETCH_ASSOC); if($result): $data = array( 'id' => $result['id'], 'fullName' => $result['name'], 'shortName' => $result['short_name'], 'hidden' => $result['hidden'], ); return $data; else: return false; endif; } public function findByName(string $name){ $sql = "SELECT `id`, `name`, `short_name`, `hidden` FROM `portal_base` WHERE `name` = :name LIMIT 1"; $stmnt = $this->dbConnect->prepare($sql); $stmnt->bindParam(":name", $name, PDO::PARAM_STR); $stmnt->execute(); $result = $stmnt->fetch(PDO::FETCH_ASSOC); if($result): $data = array( 'id' => $result['id'], 'fullName' => $result['name'], 'shortName' => $result['short_name'], 'hidden' => $result['hidden'], ); return $data; else: return false; endif; } public function findByShortName(string $name){ $sql = "SELECT `id`, `name`, `short_name`, `hidden` FROM `portal_base` WHERE `short_name` = :name LIMIT 1"; $stmnt = $this->dbConnect->prepare($sql); $stmnt->bindParam(":name", $name, PDO::PARAM_STR); $stmnt->execute(); $result = $stmnt->fetch(PDO::FETCH_ASSOC); if($result): $data = array( 'id' => $result['id'], 'fullName' => $result['name'], 'shortName' => $result['short_name'], 'hidden' => $result['hidden'], ); return $data; else: return false; endif; } public function update(int $id, string $shortName, string $fullName, int $hidden){ $sql = "UPDATE `portal_base` SET `short_name` = :shortName, `name` = :fullName, `hidden` = :hidden WHERE `id` = :id"; $stmnt = $this->dbConnect->prepare($sql); $stmnt->bindParam(":id", $id, PDO::PARAM_INT); $stmnt->bindParam(":fullName", $fullName, PDO::PARAM_STR); $stmnt->bindParam(":shortName", $shortName, PDO::PARAM_STR); $stmnt->bindParam(":hidden", $hidden, PDO::PARAM_INT); if ($stmnt->execute()): return $this->findById($id); else: return false; endif; } public function save(string $shortName, string $fullName, int $hidden){ if($this->findByShortName($shortName) === false): $sql = "INSERT INTO `portal_base`(`id`, `short_name`, `name`, `hidden`) VALUES (null, :shortName, :fullName, :hidden)"; $stmnt = $this->dbConnect->prepare($sql); $stmnt->bindParam(":fullName", $fullName, PDO::PARAM_STR); $stmnt->bindParam(":shortName", $shortName, PDO::PARAM_STR); $stmnt->bindParam(":hidden", $hidden, PDO::PARAM_INT); if ($stmnt->execute()): $result = $this->findById((int)$this->dbConnect->lastInsertId()); else: return false; endif; return $result; else: return false; endif; } Ну и код создания объекта в приложении PHP: $baseMapper = new BaseMapper(new PdobaseStorage($dbgConnect)); $obj_base_1 = $baseMapper->findByShortName('PAP'); echo sprintf('obgId:%d--ID:%d----ShortName: %s----FullName: %s<br/>', spl_object_id($obj_base_1), $obj_base_1->id(), $obj_base_1->shortName(), $obj_base_1->fullName());