Автозагрузка обязательных классов из пользовательского ввода в PHP

Позвольте мне начать с того, что я программист PHP среднего уровня, который изучает ООП. У меня запущен сайт, но я хотел бы разбить свой код, чтобы реализовать более гибкий шаблон проектирования... и потому, что ООП просто потрясающий.

В моем исходном коде я использовал switch операторы для вызова функций, соответствующих запросу пользователя.

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

Это делает его очень негибким и требует от меня изменения кода в нескольких местах для добавления новых опций, которые пользователь может запросить.

Я думаю о том, чтобы изменить его на вызов класса Polymorphic. Я использую composer, поэтому у меня есть настройки Objects для автозагрузки со стандартами PSR-4. Таким образом, ответ кажется простым, если пользовательский запрос "яблоко", я мог бы создать

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

Но если пользователь вручную вводит что-то, что не существует... скажем,"оранжевый", какой метод я бы использовал, чтобы добавить в белый список вводимые пользователем данные? Как я уже сказал, это мое первое предприятие в ООП, и я хотел бы выбрать стандарты дизайна, которые вы, ребята, используете. Я думаю, инкапсулируя блок внутри try{} & catch(){} блок, но так ли это должно быть сделано?

Любой совет будет принята с благодарностью:)

Ура, Ниро

Обновление: я хотел бы сделать это более ясным, потому что это, возможно, не было прежде. Я ищу подход, чтобы сделать это таким образом, чтобы можно было добавить новые объекты подкласса продукта (реализуя интерфейс продукта). Таким образом, я могу добавлять различные типы продуктов без изменения кода везде.

1 ответ

Решение

Ну, вы всегда можете использовать class_exist('Product\\Apple'),

class_exists принимает 2 аргумента:

  1. Имя класса (полное, с пространством имен)
  2. Логическое значение, пытаться ли автозагрузить класс или нет. По умолчанию это правда.

Функция возвращает логическое значение.

Так ты пишешь

$fullClassName = "Product\\$request";
if(class_exists($fullClassName )) {
    $product = new $fullClassName();
}
else {
    //error here
}
Другие вопросы по тегам