请教一个关于用变量实例化类的问题?

详细说一下场景:
根据礼包类型我写了多个实例的类,我希望在模型中写一个方法,会根据type自动实例化这个类,然后调用这个类的实例,
但我目前的代码还是:

    switch ($model->type)
    {
        case 1:
            $type_1 =  new type_1_class($foo,$bar);
            $ret = $type_1->do();
            return $ret;
            break;
            case 2:
            ...
    }

我已经尝试很多方法想让代码更简洁一些,也把PHP 代码简洁之道 ( PHP Clean Code)看了很多遍,还是没想出好办法,给我个提示吧

附言 1  ·  6年前

我现在的做法是,写一个interface和一个abstract,然后针对每个类型的礼包类,在abstract里用变量实例化,然后调用,不知道谁能给点更好的建议

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 7
leo
$map = [
  'a' => 'class_a',
  'b' => 'class_b',
  'c' => 'class_c',
];
if(!isset($map[$model->type])) {
  // throw exception
}
$class = $map[$model->type];
$obj = new $class($foo,$bar);
$ret = $obj->do();
6年前 评论

@leo 我想问一下,为什么我类名用变量报错未找到控制器?

6年前 评论
leo

@Chairmanwong 类名用变量需要完整的类名,比如

//正确
$class = 'App\User';
$user = new $class();

//错误
$class = 'User';
$user = new $class();
6年前 评论

一般我写map是

    const CLASS_MAP = [
        'a' => A::class,
        ];
6年前 评论

@leo 我现在也觉得是命名空间出的问题,但是我一直都是加有命名空间的。。。然后直接报错没发现该类

6年前 评论

@leo 谢谢。。。。可以了,百度出来是需要命名空间的,但是问题应该出在代码同步上。。。。。

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!