2015-05-19 18 views
5

Tôi có một cuộc gọi chuỗi như vậy:Làm thế nào để chuỗi chức năng cuộc gọi bằng cách sử dụng một chuỗi chứa chuỗi đó trong PHP

$object->getUser()->getName(); 

tôi biết rằng tôi có thể sử dụng một chuỗi để gọi một chức năng trên một đối tượng:

$functionName = 'getUser'; 
$object->$functionName() or call_user_func(array($object, functionName)) 

Tôi đã tự hỏi liệu có thể thực hiện tương tự cho một cuộc gọi chuỗi không? Tôi cố gắng để làm:

$functionName = 'getUser()->getName'; 
$object->functionName(); 

Nhưng tôi nhận được một lỗi

tên Phương pháp phải là một chuỗi

Tôi đoán đây là do ()-> không thể được giải thích bởi vì họ là một phần của chuỗi? Có cách nào tôi có thể đạt được điều này mà không cần phải làm:

$function1 = getUser; 
$function2 = getName; 
$object->$function1()->$function2(); 

Mục đích là để có được một loạt các chức năng và chuỗi chúng, để gọi chuỗi này trên đối tượng nhất định, ví dụ:

$functions = array('getCoordinates', 'getLongitude'); // or any other chain call 
$functionNames = implode('()->',$functions); 
$object->$functionNames() 
+0

Trong phương thức lớp của bạn, hãy trả về lớp hiện tại bằng cách thực hiện điều này 'return $ this;' '. – Akar

+1

@Voitcus Bạn có thể cho tôi một ví dụ không? – skirato

+0

@Akar Tôi không hiểu ý của bạn là gì ... – skirato

Trả lời

13

Hãy bắt đầu với một định dạng văn bản trung tính hơn đó là dễ dàng để xử lý:

$chain = 'getUser.getName'; 

Và sau đó chỉ cần reduce nó:

$result = array_reduce(explode('.', $chain), function ($obj, $method) { 
    return $obj->$method(); 
}, $object); 

Lưu ý rằng bạn thậm chí có thể kiểm tra $obj để tìm hiểu xem $method là phương pháp hay thuộc tính hoặc thậm chí chỉ mục mảng và return giá trị phù hợp. Xem Twig để lấy cảm hứng.

+1

Đẹp nhất, nhưng 'phát nổ' có thể sử dụng nhiều chuỗi như một dấu phân cách, do đó, không có vấn đề với' -> ' – Voitcus

+0

Có, nhưng mục đích là bắt đầu từ một biểu thức trung lập ngôn ngữ, không phải PHP-code-as- chuỗi. – deceze

1

Tôi đang cố tạo một cách chung để lọc các đối tượng trong và mảng. Đôi khi, quá trình lọc này yêu cầu một cuộc gọi chuỗi để so sánh các trường cụ thể với một giá trị nhất định.

Tôi nghĩ rằng thay vì phát minh ra giải pháp mới, bạn có thể sử dụng giải pháp hiện tại như PropertyAccess Component từ Symfony.

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