<?php 
 | 
  
 | 
/** 
 | 
 * 服务定位器[暂定版] 
 | 
 */ 
 | 
class System_Service_Locator{ 
 | 
  
 | 
    protected $_components; //保存组件实例 
 | 
    protected $_definitions; //保存组件定义 
 | 
    public static $instance; 
 | 
  
 | 
    public static function getInstance(){ 
 | 
        if(self::$instance){ 
 | 
            return self::$instance; 
 | 
        } 
 | 
        return self::$instance = new self; 
 | 
    } 
 | 
  
 | 
    public function __get($name) 
 | 
    { 
 | 
        return $this->get($name); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 注册服务 
 | 
     * @param $name 
 | 
     * @param $definition 
 | 
     */ 
 | 
    public function set($name, $definition) 
 | 
    { 
 | 
        if(is_string($definition) || is_object($definition) || is_callable($definition, true)) { 
 | 
            $this->_definitions[$name] = $definition; 
 | 
        }else{ 
 | 
            throw new InvalidArgumentException('Invalid definition.'); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 数组方式注册服务 
 | 
     * @param [type] $definitions [description] 
 | 
     */ 
 | 
    public function setByArrs($definitions){ 
 | 
        foreach ($components as $id => $definition) { 
 | 
            $this->set($id, $definition); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 读取服务 
 | 
     * @param $name 
 | 
     * @return mixed 
 | 
     */ 
 | 
    public function get($name) 
 | 
    { 
 | 
        if(isset($this->_components[$name])){ 
 | 
            return $this->_components[$name]; 
 | 
        } 
 | 
  
 | 
        if(!isset($this->_definitions[$name])){ 
 | 
           return false; 
 | 
        } 
 | 
  
 | 
        if(is_string($this->_definitions[$name]) && class_exists($this->_definitions[$name])){ 
 | 
            return $this->_components[$name] = new $this->_definitions[$name]; 
 | 
        } 
 | 
  
 | 
        if(is_callable($this->_definitions[$name], true)){ 
 | 
            return $this->_components[$name] = call_user_func_array($this->_definitions[$name], []); 
 | 
        } 
 | 
  
 | 
        throw new InvalidArgumentException("Undefined service $name"); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * @param $name 
 | 
     * @return bool 
 | 
     */ 
 | 
    public function has($name) 
 | 
    { 
 | 
        return isset($this->_definitions[$name]); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * @param $name 
 | 
     */ 
 | 
    public function clear($name) 
 | 
    { 
 | 
        unset($this->_components[$name], $this->_definitions[$name]); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * @return mixed 
 | 
     */ 
 | 
    public function getComponents() 
 | 
    { 
 | 
        return $this->_components; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * @return mixed 
 | 
     */ 
 | 
    public function getDefintions() 
 | 
    { 
 | 
        return $this->_definitions; 
 | 
    } 
 | 
} 
 |