ThinkSSL🔒 一键申购 5分钟快速签发 30天无理由退款 购买更放心 广告
`注册树模式`又称`注册模式`或`注册器模式`。 注册树模式通过将对象实例注册到一棵全局的对象树上,需要的时候从对象树上采摘的模式设计方法 注册上去后可以无限采摘 创建好这个对象如何直接获得这个对象呢就用注册模式 ``` class Registry{ static private $_store=array(); /** * 将对象注册到$_store上 * @param object $obj 类的实例化对象 * @param string|null $name 该对象的实际类名 */ static public function set($obj,$name=null){ if (!is_object($obj)) { throw new Exception("参数不是期望的类对象", 1); } $name=(!is_null($name))?:get_class($obj); $name=strtolower($name); $return=null; if (isset(self::$_store[$name])) { $return = self::$_store[$name]; } self::$_store[$name]=$obj; return $return; } static public function get($name){ $name=strtolower($name); if (!self::isContains($name)) { throw new Exception("该类的实例对象不存在", 1); } return self::$_store[$name]; } static public function remove($name){ $name=strtolower($name); if (self::isContains($name)) { unset(self::$_store[$name]); } } /** * 检查给定的类的类对象是否挂载到注册树($_store)上 * @param [type] $name [description] * @return boolean [description] */ static public function isContains($name){ $name=strtolower($name); if (!isset(self::$_store[$name])) { return false; } return true; } } class Fruit{} $std=new stdClass(); Registry::set($std); $fruit=new Fruit(); Registry::set($fruit); $std=Registry::get("stdClass"); $fruit=Registry::get("Fruit"); var_dump($std); var_dump($fruit); ``` 例子2:与工厂模式结合 ``` <?php 前面的工厂加单例模式用到的话还是需要调用工厂或者。。定义好后如何取到这个类呢一般就要用到注册模式 用来将一些对象注册到全局树上面 就可以在任何地方访问 还可以给对象取别名; 工厂模式和注册模式配合使用,放到程序初始化里面 Register.php: namespace IMooc; class Register{ protected static $objects; //第一个参数是第二个参数(对象)的映射的名(将对象放到树上) static function set($alias,$object){ self::$objects[$alias] = $object; } //unset是php的关键字所以前面加了个_ function _unset(){ return self::$objects[$alias]; } static function get($objectname){ if (!isset(self::$objects[objectname])) { throw new Exception("对象不存在", 1); } return self::$objects[objectname]; } } namespace IMooc; class Factory{ static function createDatabase(){ //$db = new Database(); $db =Database::connectDB(); Register::set('db1',$db);//调用注册类的方法将db对象放进注册树中对象的别名叫db1 return $db; } } 其他任何文件: 获取对象:$db = \IMooc\Register::get('db1'); database.php: class Database { public static $mark = null; // 定义标识符(通过$mark值得改变情况,来判定Model类是否被实例化) // __construct()只执行一次 private final function __construct(){ // 链接数据库 mysql_connect('localhost','root',''); echo '数据库链接成功<br>'; } // 申明静态方法,由类名直接调用此方法,来实例化Model类 // 在静态方法中,绝不可以使用$this($this是对象产生之后才会有的) public static function connectDB() { // 实例化Model类 if (self::$mark == null) { // self:代表自身(self=Model) self::$mark = new self(); } return self::$mark; } public function select(){ echo '查询数据'; } public function insert(){ } } ```