本次代码符合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();
注册模式 ,全局共享和交换对象