2012-04-23 2 views
13

В настоящее время мой код выглядит следующим образом:Проверьте класс имеет метод в PHP

switch ($_POST['operation']) { 
    case 'create': 
     $db_manager->create(); 
     break; 
    case 'retrieve': 
     $db_manager->retrieve(); 
     break; 
... 
} 

То, что я хочу сделать, это, чтобы проверить, если метод называется $_POST['operation'] существует: если да, то это называют, еще эхо «ошибка» Является ли это возможным? Как я могу это сделать?

ответ

29

Вы можете использовать method_exists:

if (method_exists($db_manager, $_POST['operation'])){ 
    $db_manager->{$_POST['operation']}(); 
} else { 
    echo 'error'; 
} 

Хотя я сильно советую вам не идти о программировании этот путь ...

+1

Почему бы не пройти этот путь? – heron

+4

@epic_syntax: Поскольку я мог, с wget/cURL, обманывать переменную POST и подбирать методы, которые вам не обязательно нужны. Кроме того, вы НИКОГДА не доверяете пользовательскому вводу напрямую, вы всегда хотите его дезинфицировать. в основном, если вы используете '$ _POST [...]' где-нибудь еще, но верх вашего файла, встроенного в чек для обеспечения безопасности, вы делаете это неправильно и задаете проблемы. –

+0

И я почти все же рекомендую [вообще не использовать PHP] (http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/) :) – iblue

9

Вы можете использовать is_callable() или method_exists().

Разница между ними в том, что последний не будет работать для случая, если __call() обрабатывает вызов метода.

2

Вы можете использовать method_exists(). Но это действительно плохая идея

Если $_POST['operation'] установлен в именах некоторых функций магии (как __set()), ваш код будет взорваться. Лучше использовать массив разрешенных имен функций.

+0

Я думаю, ты имеешь в виду нечто подобное. $ operations = array ("retrieve", "create"); if (isset ($ _ POST ['operation']) && in_array ($ _ POST ['operation'], $ operations)) { $ db_manager -> {$ _ POST ['operation']}(); } Можно ли «собирать» все доступные методы в массив автоматически или только вручную? – heron

+0

Позволяя пользователям вызывать произвольные методы в объекте, как правило, плохая идея (и ее медленная, как черт). Создайте свой собственный список или даже лучше используйте оператор switch из своего вопроса. – iblue

Смежные вопросы