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