空对象模式不属于 GoF 设计模式,可是它做为一种常常出现的套路足以被视为设计模式。它具备以下优势:php
客户端代码简单laravel
能够减小报空指针异常的概率面试
测试用例不须要考虑太多条件sql
返回一个对象或 null 应该用返回对象或者 NullObject 代替。NullObject 简化了死板的代码,消除了客户端代码中的条件检查,例如 if (!is_null($obj)) { $obj->callSomething(); } 只需 $obj->callSomething(); 就行。shell
Symfony2: 空日志设计模式
Symfony2: Symfony/Console 空输出服务器
命令行模式中的空命令架构
责任链模式中的空处理器并发
<?php namespace DesignPatterns\Behavioral\NullObject; /** * 建立服务类 Service 。 */ class Service { /** * @var LoggerInterface * 定义日记类对象。 */ private $logger; /** * @param LoggerInterface $logger * 传入日记类对象参数。 */ public function __construct(LoggerInterface $logger) { $this->logger = $logger; } /** * 作些什么。。。 * 在日记中返回了 '咱们在 Service: doSomething 里' 。 */ public function doSomething() { // 提示:这里你只是使用它,而不须要经过如:is_null() 检查 $logger 是否已经设置。 $this->logger->log('We are in '.__METHOD__); } }
<?php namespace DesignPatterns\Behavioral\NullObject; /** * 重要特征:空日记必须像其余日记意向从这个接口继承。 */ interface LoggerInterface { public function log(string $str); }
<?php namespace DesignPatterns\Behavioral\NullObject; /** * 建立一个日记打印类实现日记接口。 */ class PrintLogger implements LoggerInterface { public function log(string $str) { echo $str; } }
<?php namespace DesignPatterns\Behavioral\NullObject; /** * 建立一个空日记类实现日记接口。 */ class NullLogger implements LoggerInterface { public function log(string $str) { // 什么也不用作 } }
<?php namespace DesignPatterns\Behavioral\NullObject\Tests; use DesignPatterns\Behavioral\NullObject\NullLogger; use DesignPatterns\Behavioral\NullObject\PrintLogger; use DesignPatterns\Behavioral\NullObject\Service; use PHPUnit\Framework\TestCase; /** * 建立测试单元 LoggerTest 。 */ class LoggerTest extends TestCase { /** * 测试 NullLogger 对象,联系上文能够知道什么也没作。 */ public function testNullObject() { $service = new Service(new NullLogger()); $this->expectOutputString(''); $service->doSomething(); } /** * 测试 PrintLogger 对象,联系上文能够知道在日记中写入了 DesignPatterns\Behavioral\NullObject\Service::doSomething 。 */ public function testStandardLogger() { $service = new Service(new PrintLogger()); $this->expectOutputString('We are in DesignPatterns\Behavioral\NullObject\Service::doSomething'); $service->doSomething(); } }
PHP 互联网架构师 50K 成长指南+行业问题解决总纲(持续更新)
面试10家公司,收获9个offer,2020年PHP 面试问题
★若是喜欢个人文章,想与更多资深开发者一块儿交流学习的话,获取更多大厂面试相关技术咨询和指导,欢迎加入咱们的群啊,暗号:phpzh(君羊号码856460874)。
内容不错的话但愿你们支持鼓励下点个赞/喜欢,欢迎一块儿来交流;另外若是有什么问题 建议 想看的内容能够在评论提出