2013-05-16 22 views
13

Tôi không thể tìm thấy bất kỳ tài liệu nào về loại đóng cửa trong PHPDoc. Vì vậy, câu hỏi của tôi là làm cách nào để xác định tham số của các tham số được gửi đến đóng và giá trị trả về của nó?Cú pháp đóng cửa trong PHPDoc

Ví dụ:

Làm thế nào để tôi mô tả rằng "gọi lại" sẽ nhận được một "MyCustomClass", một số và một String, và trả về một "MyOtherCustomClass"?

/** 
* @param MyCustomClass $cls 
* @param Closure  $callback this isn't really explaining what this is 
* 
* @return MyOtherCustomClass 
*/ 
function changer($cls, $callback){ 

    return $callback($cls, 2, "a string"); 
} 

changer($aCustomeClass, function($cls, $int, $string){ 
    return new MyOtherCustomClass($cls, $int, $string); 
}) 

Hoặc nếu có thể?

+0

Tôi không nghĩ có cách hợp lý để mô tả nó trong chú thích. Ngay cả trong hướng dẫn sử dụng PHP, chúng chỉ được tham chiếu là 'có thể gọi được 'trong các mô tả các đối số. –

+0

Đó là những gì tôi e ngại nhưng sẽ rất tuyệt nếu có thể. –

+1

"Chiều sâu Đóng cửa định nghĩa" thảo luận: https://github.com/phpDocumentor/phpDocumentor2/issues/830 –

Trả lời

10

@param callable $callback thực sự là cú pháp để sử dụng cho phần đó. Bạn không giới hạn tham số đó thành một đóng cửa ... bất kỳ cái gọi nào được truyền cho nó sẽ được chấp nhận trong việc thực hiện đó. Có thể gọi là "loại PHP" hợp pháp, vì vậy phpDocumentor chấp nhận nó là một Loại hợp lệ.

Trong mã ví dụ của bạn, có thực sự không một lý do không thể cho rằng phương pháp changer() của bạn trả về một MyOtherCustomClass(), vì đó là hoàn toàn quyết định bởi cách bạn viết đóng cửa sau này trong việc sử dụng changer(). Tốt nhất, bạn muốn biểu thị trong một chú thích tại việc sử dụng changer() rằng sử dụng đặc biệt này của changer()MyOtherCustomClass lợi nhuận, bởi vì nó là thực hiện việc sử dụng, không phải thực hiện changer() chính nó, mà trả về kiểu cụ thể của đối tượng.

Đối với việc lập tài liệu các đối số mà người qua cuộc gọi là "bắt buộc" để chấp nhận, tôi giả sử bạn phải làm điều đó trong phần mô tả của thẻ param. Không có cú pháp để mô tả một trường hợp như vậy.

Nếu tôi thực hiện một cái gì đó theo cách này, tôi sẽ áp đặt một giao diện mà các cuộc gọi phải tất cả trở lại rõ ràng, và do đó tôi có thể viết rằng changer() trả về giao diện đó. Tất nhiên, điều này có nghĩa là MyOtherCustomClass của bạn phải triển khai giao diện đó, nhưng vẫn còn, dường như tôi là cách duy nhất để đến gần "thực thi" một loại trả về từ changer().

+0

Giao diện có thể giải quyết được sự cố nếu tôi viết lại mã. Trong trường hợp của tôi không phải là một tùy chọn tho. –

+0

Thật vậy, viết lại mã có thể là một ràng buộc ;-) Tôi đã tìm thấy suy nghĩ về các tùy chọn mà tôi loại trừ có thể đôi khi làm cho những ý tưởng mới khác xuất hiện, vì vậy tôi có xu hướng đề cập đến những điều như vậy . – ashnazg

+0

givin u dấu chceck ... tho không sử dụng được cho dự án hiện tại của tôi, nó là giải pháp cho vấn đề nói chung :) –