本次代码符合PHP规范PRS_0,根目录下新建一个Frame的目录(核心目录),建立APP目录(项目目录),统一访问入口文件index.php,建立类文件Loader.php(用于自动加载类)
index.php 公共部分
define('BASEDIR',__DIR__);
include BASEDIR.'/Frame/Loader.php';
spl_autoload_register('\\Frame\\Loader::autoload');
Loader.php
<?php
namespace Frame;
class Loader
{
static function autoload($class)
{
require BASEDIR.'/'.str_replace('\\','/',$class).'.php';
}
}
注册树模式
- 上面两种设计模式有一个缺点,就是必须要调用这个工厂类或者单例类。
- 注册树模式就是把用到的类直接放到注册树上,用的时候直接拿,可以理解为统一的管理对象。
这样我们工厂方法和单例方法只需要构造一次(一般在环境初始化的时候注册就可以调用了)
创建Register.php 类
<?php namespace Frame; class Register { protected static $objects;//存放对象 // $alias 别名 $object 对象 static public function set($alias ,$object) { self::$objects[$alias] = $object; } //通过别名获取注册树上的某个对象 static public function get($name) { return isset(self::$objects[$name]) ? self::$objects[$name] : null; } //通过别名删除注册树上的某个对象 static public function _unset($alias) { unset(self::$objects[$alias]); } }
结合注册数模式、单例模式、工厂模式。修改Factory.php
<?php namespace Frame; class Factory { static public function createDatabase() { //$db = new \Frame\Database(); //单一工厂模式 //$db = Database::getInstance(); //结合单例模式的工厂模式 $db = Register::get('db1'); //结合注册数模式、单例模式、工厂模式 if ($db) { return $db; } else { $db = Database::getInstance(); Register::set('db1', $db); return $db; } } }
index.php中调用
<?php define('BASEDIR',__DIR__); include BASEDIR.'/Frame/Loader.php'; spl_autoload_register('\\Frame\\Loader::autoload'); \Frame\Factory::createDatabase();
One comment
注册模式 ,全局共享和交换对象