2012-04-23 40 views
13

Hiện nay mã của tôi trông như thế:Kiểm tra nếu lớp có phương pháp trong PHP

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

Những gì tôi muốn làm là, để kiểm tra xem phương pháp gọi là $_POST['operation'] tồn tại: nếu có thì gọi nó, khác echo "lỗi" Có thể không? Tôi có thể làm cái này như thế nào?

Trả lời

29

Bạn có thể sử dụng method_exists:

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

Mặc dù tôi mạnh khuyên bạn không đi về lập trình theo cách này ...

+1

Tại sao không đi theo cách này? – heron

+4

@epic_syntax: Bởi vì tôi có thể, với wget/cURL, giả mạo biến POST và tăng xung quanh các phương thức bạn không nhất thiết muốn tiếp xúc. Ngoài ra, bạn KHÔNG BAO GIỜ tin tưởng người dùng nhập trực tiếp, bạn luôn muốn vệ sinh nó. về cơ bản, nếu bạn đang sử dụng '$ _POST [...]' ở bất kỳ nơi nào khác nhưng đầu tệp của bạn được nhúng trong một kiểm tra an toàn, bạn đang làm sai và yêu cầu sự cố. –

+0

Và tôi gần như chắc chắn, bạn sẽ khuyên bạn nên [không sử dụng PHP chút nào] (http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/) :) – iblue

9

Bạn có thể sử dụng is_callable() hoặc method_exists().

Sự khác biệt giữa chúng là sau này sẽ không hoạt động đối với trường hợp, nếu __call() xử lý cuộc gọi phương thức.

2

Bạn có thể sử dụng method_exists(). Nhưng đây thực sự là một ý tưởng tồi:

Nếu $_POST['operation'] được đặt thành một số tên hàm ma thuật (như __set()), mã của bạn sẽ vẫn phát nổ. Sử dụng tốt hơn một mảng các tên hàm được cho phép.

+0

Tôi nghĩ, Bạn có ý nghĩa như thế này. $ operations = array ("truy xuất", "tạo"); if (isset ($ _ POST ['operation']) && in_array ($ _ POST ['operation'], $ operation)) { $ db_manager -> {$ _ POST ['operation']}(); } Tôi có thể 'thu thập tất cả các phương thức có sẵn vào một mảng tự động hoặc chỉ bằng tay không? – heron

+0

Cho phép người dùng gọi các phương thức tùy ý trong một đối tượng thường là một ý tưởng tồi (và nó chậm như địa ngục). Tạo danh sách của riêng bạn hoặc thậm chí sử dụng tốt hơn câu lệnh chuyển đổi từ câu hỏi của bạn. – iblue

Các vấn đề liên quan