从PHP中的用户输入自动加载所需的类

时间:2014-05-02 18:07:41

标签: php c oop polymorphism whitelist

首先让我说我是一名正在学习OOP的中级PHP编码员。我有一个网站正在运行,但我想打破我的代码以实现更灵活的设计模式......并且因为OOP非常棒。

在我的原始代码中,我使用switch语句来调用与用户请求相对应的函数。

$request = (string) $_GET['fruit'];
switch ($request) {
    case 'apply':
        Get_Apple();
    default:
        Error_Not_A_Fruit();
        exit;
}

这使得它非常不灵活,要求我在多个位置更改代码,以添加用户可能要求的新选项。

我正在考虑将其更改为Polymorphic类调用。我正在使用作曲家,所以我的对象设置为自动加载PSR-4标准。所以答案似乎很简单,如果用户请求是“apple”,我可以创建

$request = (string) $_GET['fruit'];
$product = new Product\$request;

但是,如果用户手动输入不存在的内容...说“橙色”,我会使用哪种方法来列出用户输入的白名单?就像我说的那样,这是我第一次进入OOP并希望获得你们使用的设计标准。我正在考虑将块封装在try{}& catch(){}阻止了,但这是应该做的吗?

任何建议都将不胜感激:)

干杯, 尼鲁

更新:我想更清楚,因为它可能不是以前。我正在寻找这样做的方法,以便可以添加新的子类产品对象(实现产品接口)。这样我就可以添加不同的产品类型而无需在任何地方更改代码。

1 个答案:

答案 0 :(得分:1)

嗯,您可以随时使用class_exist('Product\\Apple')

class_exists有两个参数:

  1. 类名(完整,带命名空间)
  2. 布尔值,是否尝试自动加载该类。默认为真。
  3. 该函数返回一个布尔值。

    所以你写了

    $fullClassName = "Product\\$request";
    if(class_exists($fullClassName )) {
        $product = new $fullClassName();
    }
    else {
        //error here
    }