2010-03-04 29 views
8

API phản chiếu là điều tuyệt vời để thao tác các công cụ OOP và có vẻ như hầu hết các nhà phát triển thậm chí không biết điều đó hoặc chưa bao giờ sử dụng.PHP: API phản chiếu - Bổ sung tuyệt vời cho PHP với ít sử dụng

Claims Reflection API:

PHP 5 đi kèm với một hoàn API phản chiếu có thêm khả năng đến các lớp học ngược-kỹ sư, giao diện, chức năng, phương pháp và phần mở rộng. Ngoài ra, API phản chiếu cung cấp các cách để truy xuất các nhận xét về tài liệu cho các hàm, lớp và phương thức.

Câu hỏi:

  • Tại sao nó hầu như không có tài liệu hướng dẫn cho hầu hết các phương thức của nó/tài sản? Bạn thấy thông báo này ở đó trên tài liệu:

Chức năng này hiện không phải là được ghi lại; chỉ có danh sách đối số của nó là có sẵn.

Tìm tài liệu ở đâu?

  • Tương lai trong tương lai, nói cách khác, tôi có thể sử dụng trong khung MVC của mình không?
  • Tại sao nó được sử dụng ít thường xuyên hơn, bất cứ điều gì sai trái với nó?
+0

@sarfraz Tôi đã nghe rất nhiều lời chỉ trích nhằm vào hiệu suất của nó. Không chắc chính xác họ đã thành lập ra sao nhưng dường như nó rất chậm. - Ngoài ra không có nhiều ví dụ hay về nó được đưa vào sử dụng tốt trong quá khứ tạo tài liệu. Tôi không nghĩ mọi người thường biết những gì có thể với nó. - Tôi tò mò muốn xem bất kỳ ví dụ thế giới thực nào mà nó đang được sử dụng _outside the box_ để nói. Sẽ là tuyệt vời nếu bạn thêm vào câu hỏi của bạn. – anomareh

+0

@anomareh: cảm ơn nhận xét và điểm hiệu suất của bạn. Một trong những scenorio tôi biết là khi bạn sử dụng 'call_user_func_array' với tham số tham chiếu, nó sẽ ném một lỗi, nhưng có nhiều cách để đối phó với điều đó bằng cách sử dụng phản ánh api. Cảm ơn – Sarfraz

Trả lời

15

Phản ánh chắc chắn là ở đây để ở. Bạn có thể sử dụng nó, nhưng hãy nhớ rằng nó được cho là chậm và overkill cho UseCases đơn giản. Sử dụng một trong các chức năng trong Classes/Objects function package thường là giải pháp thay thế nhanh hơn.

Một UseCase nơi Reflection có ích khi phân tích cú pháp cho chú thích trong DocBlock của một lớp. Ví dụ, PHPUnit sử dụng các chú thích @test để báo cho PHPUnit TestRunner rằng nó nên xem xét một phương thức một phép thử. Chú thích @covers sẽ giúp chú thích thu thập dữ liệu Phạm vi mã. Khuôn khổ FLOW3 sử dụng Annotations for their AOP framework.

Thật không may, một số bổ sung mới hơn cho PHP> 5.3, chưa được ghi lại nhiều. Just look at the SPL. Điều tương tự. Điều đó không có nghĩa là bạn không thể sử dụng nó. API phản chiếu rất rõ ràng và dễ dàng tìm ra từ các tên phương thức. Và Google thường có các bài đăng trên blog về cách sử dụng các tiện ích mở rộng nhất định.Đối với các API Reflection, hãy kiểm tra:

và cho SPL


Tôi vừa mới khám phá điều gì đó mới mẻ. Kể từ 5.1.2, bạn cũng có thể invoke the Reflection API from the command line quá:

$php --rf strtotime 
Function [ <internal:date> function strtotime ] { 

    - Parameters [2] { 
    Parameter #0 [ <required> $time ] 
    Parameter #1 [ <optional> $now ] 
    } 
} 
+0

Có bất kỳ thông tin nào về cách nó thực sự hoạt động sau hậu trường không? Tôi biết nó không phải siêu nhanh, mà là dễ hiểu. Nhưng có phải vì nó phân tích mã mọi lúc hay nó sử dụng thứ gì đó thông minh hơn, giống như khi lớp được nạp vào bộ nhớ, nó được tiêu hóa thành các phần nhỏ hơn và thông tin này được sử dụng để "phản ánh" lớp thực tế? –

+0

@IanBytchek bạn có thể kiểm tra mã nguồn tại http://lxr.php.net/xref/PHP_TRUNK/ext/reflection/ – Gordon

+0

Tôi có thể và tôi đã làm, kỹ năng C của tôi chỉ cao hơn một chút so với con khỉ và tôi đã tự hỏi nếu bạn đã có câu trả lời rồi. Sẽ rất thú vị khi biết nếu không thực hiện công việc khó khăn - không phải cách tiếp cận thông thường, lời hứa :) –

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