サービス ロケーター (サービス ロケーター) は、アプリケーションに必要なサービスを見つける (作成または取得する) 方法を知っています。サービス ユーザーは、実際の使用時にサービスの実際の実装を気にする必要はありません。この記事では主に、PHP デザイン パターンのサービス ロケーター パターンの例について詳しく説明します。お役に立てれば幸いです。
何をするのですか?
は、コードを変更する必要はなく、単にサービスを設定して更新するだけで実現します。
UML図
コード例
class ServiceLocator { /** * 服务实例索引 */ privite $_services = []; /** * 服务定义索引 */ private $_definitions = []; /** * 是否全局服务共享(单例模式) */ private $_shared = []; public function has($id){ return isset($this->_services[$id]) || isset($this->_definitions[$id]); } public function __get($id){ if($this->has($this->id)){ $this->get($id); } // another implement } public function get($id){ if(isset($this->_services[$id]) && $this->_shared[$id]){ return $this->_services[$id]; } if (isset($this->_definitions[$id])) { // 实例化 $definition = $this->_definitions[$id]; $object = Creator::createObject($definition);//省略服务实例化实现 if($this->_shared[$id]){ $this->_services[$id] = $object } return $object; } throw new Exception("无法定位服务{$id}") } public function set($id,$definition,$share = false){ if ($definition === null) { unset($this->_services[$id], $this->_definitions[$id]); return; } unset($this->_services[$id]); $this->_shared[$id] = $share; if (is_string($definition)) { return $this->_definitions[$id] = $definition; } if (is_object($definition) || is_callable($definition, true)) { return $this->_definitions[$id] = $definition; } if (is_array($definition)) { if (isset($definition['class'])) { return $this->_definitions[$id] = $definition; } } throw new Exception("服务添加失败"); } }
関連する推奨事項:
以上がPHPデザインパターンのサービスロケータパターン例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。