本次代码符合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(); 

关注友儿不迷路

Last modification:September 6th, 2020 at 10:19 am
如果觉得我的文章对你有用,请随意赞赏