本次代码符合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 3, 2022
如果觉得我的文章对你有用,请随意赞赏