Автозагрузка обязательных классов из пользовательского ввода в 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 аргумента:
- Имя класса (полное, с пространством имен)
- Логическое значение, пытаться ли автозагрузить класс или нет. По умолчанию это правда.
Функция возвращает логическое значение.
Так ты пишешь
$fullClassName = "Product\\$request";
if(class_exists($fullClassName )) {
$product = new $fullClassName();
}
else {
//error here
}