目的是可以存储在应用程序中常常使用的对象实例,一般会使用只有静态方法的抽象类来实现(或使用单例模式)。须要注意的是这里可能会引入全局的状态,咱们须要使用依赖注入来避免它。php
Zend 框架 1:Zend_Registry 实现了整个应用程序的 logger 对象和前端控制器等前端
Yii 框架:CWebApplication 具备所有应用程序组件,例如 CWebUser,CUrlManager 等。laravel
<?php namespace DesignPatterns\Structural\Registry; /** * 建立注册表抽象类。 */ abstract class Registry { const LOGGER = 'logger'; /** * 这里将在你的应用中引入全局状态,可是不能够被模拟测试。 * 所以被视做一种反抗模式!使用依赖注入进行替换! * * @var array * 定义存储值数组。 */ private static $storedValues = []; /** * @var array * 定义合法键名数组。 * 可在此定义用户名惟一性。 */ private static $allowedKeys = [ self::LOGGER, ]; /** * @param string $key * @param mixed $value * * @return void * 设置键值,并保存进 $storedValues 。 * 可视做设置密码。 */ public static function set(string $key, $value) { if (!in_array($key, self::$allowedKeys)) { throw new \InvalidArgumentException('Invalid key given'); } self::$storedValues[$key] = $value; } /** * @param string $key * * @return mixed * 定义获取方法,获取已存储的对应键的值 * 可视做验证用户环节,检查用户名是否存在,返回密码,后续验证密码正确性。 */ public static function get(string $key) { if (!in_array($key, self::$allowedKeys) || !isset(self::$storedValues[$key])) { throw new \InvalidArgumentException('Invalid key given'); } return self::$storedValues[$key]; } }
<?php namespace DesignPatterns\Structural\Registry\Tests; use DesignPatterns\Structural\Registry\Registry; use stdClass; use PHPUnit\Framework\TestCase; /** * 建立自动化测试单元。 */ class RegistryTest extends TestCase { public function testSetAndGetLogger() { $key = Registry::LOGGER; $logger = new stdClass(); Registry::set($key, $logger); $storedLogger = Registry::get($key); $this->assertSame($logger, $storedLogger); $this->assertInstanceOf(stdClass::class, $storedLogger); } /** * @expectedException \InvalidArgumentException */ public function testThrowsExceptionWhenTryingToSetInvalidKey() { Registry::set('foobar', new stdClass()); } /** * 注 @在此运行隔离进程:没有它的话,前一个测试单元可能已经设置它, * 而且测试将不能运行,这就是为何你应该实现依赖注入, * 由于注入类会很容易被测试单元替代。 * * @runInSeparateProcess * @expectedException \InvalidArgumentException */ public function testThrowsExceptionWhenTryingToGetNotSetKey() { Registry::get(Registry::LOGGER); } }
PHP 互联网架构师 50K 成长指南+行业问题解决总纲(持续更新)shell
面试10家公司,收获9个offer,2020年PHP 面试问题设计模式
★若是喜欢个人文章,想与更多资深开发者一块儿交流学习的话,获取更多大厂面试相关技术咨询和指导,欢迎加入咱们的群啊,暗号:phpzh(君羊号码856460874)。数组
内容不错的话但愿你们支持鼓励下点个赞/喜欢,欢迎一块儿来交流;另外若是有什么问题 建议 想看的内容能够在评论提出架构