ホームページ  >  記事  >  バックエンド開発  >  PHPデザインパターンのサービスロケータパターン例を詳しく解説

PHPデザインパターンのサービスロケータパターン例を詳しく解説

小云云
小云云オリジナル
2018-01-25 13:56:081853ブラウズ

サービス ロケーター (サービス ロケーター) は、アプリケーションに必要なサービスを見つける (作成または取得する) 方法を知っています。サービス ユーザーは、実際の使用時にサービスの実際の実装を気にする必要はありません。この記事では主に、PHP デザイン パターンのサービス ロケーター パターンの例について詳しく説明します。お役に立てれば幸いです。

何をするのですか?

は、コードを変更する必要はなく、単にサービスを設定して更新するだけで実現します。

UML図
PHPデザインパターンのサービスロケータパターン例を詳しく解説

コード例

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の詳細な説明メモパターンのデザインパターン

詳しい説明 PHPデザインパターンビルダーパターン


以上がPHPデザインパターンのサービスロケータパターン例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。