Проверьте, есть ли у класса метод в PHP

В настоящее время мой код выглядит так:

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

Я хочу проверить, вызван ли метод$_POST['operation'] существует: если да, то вызовите его, иначе echo & quot; error & quot; Является ли это возможным? Как я могу это сделать?

Ответы на вопрос(4)

is_callable () или жеmethod_exists ().

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

method_exists(). But this is a really bad idea

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

 heron23 апр. 2012 г., 22:41
Я думаю, вы имеете в виду что-то вроде этого. $ operations = array (& quot; получить & quot ;, & quot; создать & quot;); if (isset ($ _ POST ["операция"]) & amp; & in_array ($ _ POST ["операция"], $ операции)) {$ db_manager- & gt; {$ _ POST [операция "&]] () ; } Могу яcollect все доступные методы в массив автоматически или только вручную?
 23 апр. 2012 г., 22:42
Позволять пользователям вызывать произвольные методы в объекте, как правило, плохая идея (и медленная, как ад). Составьте свой собственный список или, что еще лучше, используйте оператор switch из вашего вопроса.
Решение Вопроса

method_exists:

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

Though I strongly advise you don't go about programming this way...

 heron23 апр. 2012 г., 22:36
Почему бы не пойти по этому пути?
 23 апр. 2012 г., 22:46
@iblue: вы просто хотели поделиться этой ссылкой и могли бы найти лучшее место, не так ли?
 17 мая 2013 г., 11:05
eats popcorn Это хорошо.
 23 апр. 2012 г., 22:44
И я почти хотел, чтобы вы порекомендовалиnot to use PHP at all :)
 23 апр. 2012 г., 22:43
@epic_syntax: поскольку я мог с помощью wget / cURL подделать переменную POST и попытаться найти методы, которые вы не обязательно хотите показывать. Кроме того, вы НИКОГДА не доверяете пользовательскому вводу напрямую, вы всегда хотите очистить его. в основном, если вы используете$_POST[...] где-нибудь еще, кроме верхней части вашего файла, встроенной в проверку безопасности, вы делаете это неправильно и напрашиваетесь на неприятности.

использованиеmethod_exists()

method_exists($obj, $method_name);

Ваш ответ на вопрос