基于php的__NAMESPACE__创建动态的工厂类


基于php的__NAMESPACE__创建动态的工厂类

场景

  • 主要用来应对增量相同的类
  • 缺点就是IDE的补全和跳转问题,当然可以通过注释来解决

主要点

  • 需要将工厂类固定到需要生产类命名空间下或者上级,固定位置的一个好处是,方便阅读
  • 使用class_exist函数来判断指定类名的类是否存在
  • 使用__NAMESPACE__来规避手动require和手动指定目录拼接

优雅demo

    <?php
    /**
    * User: jenson
    * Date: 2020/7/15
    * Time: 0:20
    */

    namespace App\Service\Factory;


    class Factory
    {
        public static function get($name)
        {
            $name = ucfirst($name);
            $class = __NAMESPACE__. '\\'. $name;
            if (class_exists($class)) {
                return new $class;
            }
            throw new \Exception("class {$name} not found");
        }
    }
    
    # 同级目录可以放置生产类供工厂类生成
    Factory::get('test1');

实际操作

  1. 如果只有确定几个类别,我觉得直接switch得了,没必要写得如此灵活。
  2. 比如laravel framework的manager们创建工厂类都是通过method设定好,比如 \Illuminate\Cache\CacheManager::createArrayDriver