目的是可以存儲在應用程序中常常使用的對象實例,一般會使用只有靜態方法的抽象類來實現(或使用單例模式)。須要注意的是這裏可能會引入全局的狀態,咱們須要使用依賴注入來避免它。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)。數組
內容不錯的話但願你們支持鼓勵下點個贊/喜歡,歡迎一塊兒來交流;另外若是有什麼問題 建議 想看的內容能夠在評論提出架構