2012-04-23 22 views
13

Obecnie mój kod wygląda tak:Sprawdź, czy klasa ma metody w PHP

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

Co chcę robić to, aby sprawdzić, czy metoda zwana $_POST['operation'] istnieje: jeśli tak to nazwać, else echo „błąd” Czy to możliwe? Jak mogę to zrobić?

Odpowiedz

29

Można użyć method_exists:

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

Choć silnie radzę nie iść na temat programowania w ten sposób ...

+1

Dlaczego nie iść tą drogą? – heron

+4

@epic_syntax: Ponieważ mógłbym, za pomocą wget/cURL, sfałszować zmienną POST i podważyć metody, których niekoniecznie chcesz ujawnić. Poza tym NIGDY nie ufasz bezpośrednio wprowadzaniu danych przez użytkownika, zawsze chcesz go zdezynfekować. w zasadzie, jeśli używasz '$ _POST [...]' nigdzie indziej, ale na górze twojego pliku osadzonego w czeku dla bezpieczeństwa, robisz to źle i proszą o kłopoty. –

+0

I prawie, polecam [w ogóle nie używać PHP] (http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/) :) – iblue

9

Można użyć is_callable() lub method_exists().

Różnica między nimi jest taka, że ​​ta ostatnia nie zadziałałaby w przypadku, jeśli __call() obsługuje wywołanie metody.

2

Można użyć method_exists(). ale jest to naprawdę zły pomysł

Jeśli $_POST['operation'] jest ustawiony na niektórych nazw magia funkcyjnych (np __set()), kod będzie nadal eksplodować. Lepiej wykorzystaj tablicę dozwolonych nazw funkcji.

+0

Myślę, masz na myśli coś takiego. $ operations = array ("pobierz", "utwórz"); if (isset ($ _ POST ['operation']) && in_array ($ _ POST ['operation'], $ operations)) { $ db_manager -> {$ _ POST ['operation']}(); } Czy mogę "zebrać" wszystkie dostępne metody do tablicy automatycznie lub tylko ręcznie? – heron

+0

Pozwalanie użytkownikom na wywoływanie dowolnych metod w obiekcie jest generalnie złym pomysłem (i powolnym jak cholera). Stwórz własną listę, a jeszcze lepiej użyj instrukcji switch z twojego pytania. – iblue

Powiązane problemy