Инструменты пользователя

Инструменты сайта


php:shablony_proektirovanija:behavioral_patterns:null_object

Null object

В объектно-ориентированном программировании Null Object — это объект с определенным нейтральным («null») поведением. Шаблон проектирования Null Object описывает использование таких объектов и их поведение (или отсутствие такового). Впервые опубликован в серии книг Pattern Languages of Program Design.
Целью Null-object'а является инкапсулирование отсутствия объекта путём замещения его другим объектом, который ничего не делает.

Данный шаблон проектирования рекомендуется использовать, когда:

  • Объект требует взаимодействия с другими объектами. Null Object не устанавливает нового взаимодействия — он использует уже установленное взаимодействие.
  • Какие-то из взаимодействующих объектов должны бездействовать.
  • Требуется абстрагирование «общения» с объектами, имеющими NULL-значение.
<?php
 
<?php
 
/**
 * Интерфейс null object
 * Interface IUser
 */
interface IUser
{
    public function getId();
    public function setId($id);
    public function setLogin($login);
    public function getLogin();
 
    public function setEmail($email);
    public function getEmail();
 
}
 
/**
 * Объект будет хранить данные пользователя, которые будут полученны из БД
 * Class User
 */
class User implements IUser {
 
    private $id;
    private $login;
    private $email;
 
    public function __construct($id, $login, $email) {
        $this->setEmail($email);
        $this->setLogin($login);
        $this->setId($id);
    }
 
    public function setId($id) {
        $this->id = $id;
    }
    public function getId() {
        return $this->id;
    }
    public function setLogin($login) {
        if(strlen($login) < 2) {
            throw new \Exception("Error");
        }
        $this->login = $login;
        return $this;
    }
    public function getLogin() {
        return $this->login;
    }
 
    public function setEmail($email) {
        if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            throw new \Exception("Error");
        }
 
        $this->email = $email;
        return $this;
    }
    public function getEmail() {
        return $this->email;
    }
}
 
/**
 * Null object посути копия объекта User, но с какимито постоянными значениями,
 * которые будут возвращены в случая если объект User невозможно будет создать
 * Class NullUser
 */
class NullUser implements IUser {
 
    private $id;
    private $login;
    private $email;
 
    public function __construct() {}
 
    public function setId($id) {}
    public function getId() {
        return "Id is empty";
    }
    public function setLogin($login) {}
    public function getLogin() {
        return "Login is empty";
    }
 
    public function setEmail($email) {}
    public function getEmail() {
        return "Email is empty";
    }
}
 
/**
 * Интерфейс для создания коннекта, и взаимодействия с БД
 * Interface IDatabaseAdapter
 */
interface IDatabaseAdapter {
    public function connect();
    public function getDb();
    public function query($query);
}
 
/**
 * Класс для взаимодействия с БД
 * Class DB
 */
class DB implements IDatabaseAdapter {
 
    private $mysqli;
    private $host;
    private $user;
    private $pass;
    private $db;
 
    public function __construct($host, $user, $password, $db)
    {
        $this->host = $host;
        $this->user = $user;
        $this->password = $password;
        $this->db = $db;
        $this->mysqli = null;
 
        $this->connect();
    }
 
    public function connect()
    {
        $this->mysqli = new \mysqli($this->host, $this->user, $this->password,  $this->db);
 
        if ($this->mysqli->connect_error) {
            die('Ошибка подключения (' . $this->mysqli->connect_errno . ') '
                . $this->mysqli->connect_error);
        }
 
    }
 
    public function getDb() {
        return $this->mysqli;
    }
    public function query($query) {
        $result = $this->mysqli->query($query);
        if($result) {
            return $result->fetch_assoc();
        }
    }
 
}
 
/**
 * класс в котором  мы используем null object
 * Class UserRepository
 */
class UserRepository
{
    private $db;
 
    public  function __construct( IDatabaseAdapter $db)
    {
        $this->db = $db;
    }
 
    public function fetchById($id)
    {
        $sql = "SELECT * FROM users WHERE id=".$id;
        $row = $this->db->query($sql);
        if(!count($row)) {//Если не найден пользователь вернем null object
            return new NullUser();
        }
 
         //пользователь был найден, используем класс User
        return $this->createUser($row);
    }
 
    private function createUser($row) {
        $user = new User($row['id'],$row['login'],$row['email']);
 
        return $user;
    }
}
 
$db = new Db('localhost','root','','patterns');
$userRepository = new UserRepository($db);
$user = $userRepository->fetchById(2);
 
echo $user->getLogin();
php/shablony_proektirovanija/behavioral_patterns/null_object.txt · Последние изменения: 2023/08/07 23:22 — werwolf