2010-12-11 37 views
5

Tôi vừa tự xây dựng một hàm lấy chuỗi URI và biến nó thành một mảng như được hiển thị bên dưới. Ví dụ này được dựa trên URL của http://mydomain.com/mycontroller/mymethod/varPHP: Gọi một lớp từ mảng?

Array 
(
    [0] => mycontroller 
    [1] => mymethod 
    [2] => var 
) 

Nếu tôi viết new $myArray[0];, tôi sẽ nạp lớp myController, nhưng tôi có thể làm cho một chức năng để xử lý các tồn tại cuối cùng của phương pháp và kêu gọi của họ với các biến tương ứng của họ?

Trả lời

8

Tôi không chắc chắn những gì bạn có ý nghĩa bởi "xử lý các tồn tại cuối cùng của phương pháp và kêu gọi của họ với các biến tương ứng của họ", nhưng bạn có thể sau call_user_func_array:

call_user_func_array(
    array($myArray[0], $myArray[1]), 
    array($myArray[2]) 
); 

Nếu bạn muốn làm điều đó cho ví dụ cụ thể mà bạn đã tạo với $controller = new $myArray(0), thay thế $myArray[0] bằng $controller, ví dụ:

$controller = new $myArray(0); 
call_user_func_array(
    array($controller, $myArray[1]), 
    array($myArray[2]) 
); 

hoặc vượt qua new $myArray[0] nếu bạn không chăm sóc về các trường hợp bị mất sau khi cuộc gọi

call_user_func_array(
    array(new $myArray[0], $myArray[1]), 
    array($myArray[2]) 
); 

Nếu không, bạn sẽ nhận được một thông báo E_STRICT và không thể tham khảo $this trong bất cứ myMethod là. Xem thêm PHP manual on possible callback formats.


Để xác nhận các phương thức và lớp thực sự tồn tại, bạn có thể sử dụng

Ví dụ:

if (method_exists($myArray[0], $myArray[1])) { 
    call_user_func_array(*/ … */) 
} 

Xin làm rõ ques của bạn nếu có điều gì khác. On a sidenote, this was probably answered before, nhưng vì tôi không chắc chắn câu hỏi là gì, tôi cũng không chắc chắn nên chọn câu hỏi nào.

+0

này chỉ hoạt động với các phương pháp tĩnh, nếu không bạn cần một thể hiện của lớp –

+0

@kemp không đúng sự thật, nhưng nói thêm làm rõ. Tôi nghĩ đó là ý của bạn. – Gordon

+0

bạn nói đúng, xấu của tôi –

1

Tôi đoán đây cũng sẽ làm việc:

$obj = new $myArray[0]; 
$obj->{$myArray[1]}($myArray[2]); 
Các vấn đề liên quan