2012-04-23 11 views
13

Attualmente il mio codice è simile che:Controllare se la classe ha metodo in PHP

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

Quello che voglio fare è, per verificare se il metodo chiamato $_POST['operation'] esiste: se sì allora chiamare, else echo "errore" È possibile? Come posso fare questo?

risposta

29

È possibile utilizzare method_exists:

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

Anche se fortemente consiglio di non andare sulla programmazione in questo modo ...

+1

Perché non andare in questo modo? – heron

+4

@epic_syntax: Perché potrei, con wget/cURL, spoofare la variabile POST e cercare metodi che non vuoi necessariamente esposti. Inoltre, non hai MAI fiducia nell'input dell'utente direttamente, lo vuoi sempre disinfettare. in sostanza, se stai usando '$ _POST [...] 'in qualsiasi altro posto tranne che nella parte superiore del tuo file incorporato in un controllo per sicurezza, stai sbagliando e chiedendo dei problemi. –

+0

E quasi quasi, dovresti raccomandare [non usare affatto PHP] (http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/) :) – iblue

9

È possibile utilizzare is_callable() o method_exists().

La differenza tra loro è che quest'ultimo non funzionerebbe per il caso, se __call() gestisce la chiamata al metodo.

2

È possibile utilizzare method_exists(). Ma questa è una pessima idea

Se $_POST['operation'] è impostato su alcuni nomi di funzione magica (come __set()), il codice sarà ancora esplodere. Meglio usare una serie di nomi di funzioni consentiti.

+0

Penso, vuoi dire qualcosa del genere. $ operations = array ("retrieve", "create"); if (isset ($ _ POST ['operazione']) && in_array ($ _ POST ['operazione'], $ operazioni)) { $ db_manager -> {$ _ POST ['operazione']}(); } Posso "raccogliere" tutti i metodi disponibili in un array automaticamente o solo manualmente? – heron

+0

Lasciare che gli utenti chiamino metodi arbitrari in un oggetto è generalmente una cattiva idea (ed è lento come l'inferno). Crea la tua lista, o ancora meglio usa l'istruzione switch dalla tua domanda. – iblue

Problemi correlati