2012-04-23 10 views
13

Actualmente mi código es el que:Comprobar si la clase tiene método en PHP

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

Lo que quiero hacer es, para comprobar si el método llamado $_POST['operation'] existe: Si sí, entonces llamarlo, else echo "error" ¿Es posible? ¿Cómo puedo hacer esto?

Respuesta

29

Puede utilizar method_exists:

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

Aunque fuertemente consejos que no voy acerca de la programación de esta manera ...

+1

¿Por qué no hacer esto? – heron

+4

@epic_syntax: Porque podría, con wget/cURL, suplantar la variable POST y buscar métodos que no necesariamente quieres exponer. Además, NUNCA confías en la entrada del usuario directamente, siempre quieres desinfectarla. Básicamente, si usa '$ _POST [...]' en cualquier otro lugar, pero la parte superior de su archivo está incrustada en un cheque de seguridad, lo está haciendo mal y está buscando problemas. –

+0

Y casi pensé que lo recomendaría [no usar PHP en absoluto] (http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/) :) – iblue

9

Puede utilizar is_callable() o method_exists().

La diferencia entre ellos es que este último no funcionaría para el caso, si __call() maneja la llamada al método.

2

Puede utilizar method_exists(). Pero esto es realmente una mala idea

Si $_POST['operation'] se establece en algunos nombres de funciones de magia (como __set()), siendo su código explotará. Es mejor usar una variedad de nombres de funciones permitidas.

+0

Creo, quieres decir algo como esto. $ operations = array ("recuperar", "crear"); if (isset ($ _ POST ['operation']) && in_array ($ _ POST ['operation'], $ operations)) { $ db_manager -> {$ _ POST ['operation']}(); } ¿Puedo 'recopilar 'todos los métodos disponibles en una matriz automáticamente o solo manualmente? – heron

+0

Dejar que los usuarios llamen a métodos arbitrarios en un objeto generalmente es una mala idea (y es lento como el infierno). Haga su propia lista, o mejor utilice la declaración de cambio de su pregunta. – iblue

Cuestiones relacionadas