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

从PHP中的用户输入自动加载所需的类,php,c,oop,polymorphism,whitelist,Php,C,Oop,Polymorphism,Whitelist,让我先说我是一个学习OOP的中级PHP程序员。我已经有了一个正在运行的站点,但是我想把我的代码分解成一个更灵活的设计模式…因为OOP非常棒 在我的原始代码中,我使用switch语句调用与用户请求相对应的函数 $request = (string) $_GET['fruit']; switch ($request) { case 'apply': Get_Apple(); default: Error_Not_A_Fruit(); e

让我先说我是一个学习OOP的中级PHP程序员。我已经有了一个正在运行的站点,但是我想把我的代码分解成一个更灵活的设计模式…因为OOP非常棒

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

$request = (string) $_GET['fruit'];
switch ($request) {
    case 'apply':
        Get_Apple();
    default:
        Error_Not_A_Fruit();
        exit;
}
这使得它非常不灵活,需要我在多个位置更改代码,以添加用户可能要求的新选项

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

$request = (string) $_GET['fruit'];
$product = new Product\$request;
但是,如果用户手动输入一些不存在的内容……比如说“橙色”,我会用什么方法将用户的输入白名单?就像我说的,这是我第一次尝试OOP,我很想学习你们使用的设计标准。我在考虑将该块封装在
try{}
&
catch(){}
块中,但这是应该做的吗

如有任何建议,将不胜感激:)

干杯, 尼罗


更新:我想说得更清楚,因为以前可能没有。我正在寻找这样一种方法,即可以添加子类Product的新对象(实现产品接口)。这样我就可以添加不同的产品类型,而无需到处更改代码

那么,您可以始终使用
class\u exist('Product\\Apple')

class_存在
接受两个参数:

  • 类名(完整,带命名空间)
  • 布尔值,无论是否尝试自动加载该类。默认值为true
  • 该函数返回一个布尔值

    所以你写

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

    谢谢你的快速回复。但这是一种可以接受的做法吗?这不会清除任何输入。例如,如果他们猜测可能有一个名为“Product\Apple\Red”的类,那么该类将被运行。我可能不清楚,我在寻找一个设计原则,因为我读过的书中没有一本是关于实现的。那么,你可以用正则表达式或其他方法过滤输入,以确保它包含一个有效的标识符。我不确定你想在这里完成什么,所以怎么可能有一个模式呢?如果您指的是MVC风格的URL,这些URL转换为正在初始化的某些控制器,那么它与文件系统功能有很大关系,比如file_exists,而不仅仅依赖于自动加载。