Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erläuterung von Service-Locator-Musterbeispielen für PHP-Entwurfsmuster

Ausführliche Erläuterung von Service-Locator-Musterbeispielen für PHP-Entwurfsmuster

小云云
小云云Original
2018-01-25 13:56:081817Durchsuche

Service Locator (Service Locator) weiß, wie die von einer Anwendung benötigten Dienste gefunden (erstellt oder bezogen) werden. Dienstbenutzer müssen sich nicht um die tatsächliche Implementierung des Dienstes bei der tatsächlichen Verwendung kümmern. In diesem Artikel wird Ihnen hauptsächlich das Service-Locator-Musterbeispiel für das PHP-Entwurfsmuster erläutert. Ich hoffe, es kann Ihnen helfen.

Was macht es?

Erreicht die Entkopplung von Dienstbenutzern und Diensten, ohne den Code zu ändern, sondern durch einfaches Konfigurieren und Aktualisieren des Dienstes.

UML-Diagramm
Ausführliche Erläuterung von Service-Locator-Musterbeispielen für PHP-Entwurfsmuster

Codebeispiel

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("服务添加失败");
    }
}

Verwandte Themen Empfehlungen:

Detaillierte Erläuterung des Delegationsmusters von PHP-Designmustern

Detaillierte Erläuterung des Memomusters von PHP-Designmustern

Detaillierte Erläuterung des PHP-Design-Pattern-Builder-Musters


Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung von Service-Locator-Musterbeispielen für PHP-Entwurfsmuster. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn