Tôi nhận thấy rằng instanceof
cũng hoạt động với các đặc điểm. Đây có phải là cách thích hợp để kiểm tra xem một lớp có sử dụng một đặc điểm nào đó hoặc có phương pháp nào khác không?Ví dụ PHP cho các đặc điểm
Trả lời
Trong khi không có gì ngăn bạn sử dụng instanceof
với các đặc điểm, cách tiếp cận được khuyến nghị là ghép các đặc điểm với giao diện. Vì vậy, bạn sẽ có:
class Foo implements MyInterface
{
use MyTrait;
}
Nơi MyTrait
là triển khai MyInterface
. Sau đó, bạn kiểm tra các giao diện thay vì những đặc điểm như sau:
if ($foo instanceof MyInterface) {
...
}
Và bạn cũng có thể gõ gợi ý, mà bạn không thể với những đặc điểm:
function bar(MyInterface $foo) {
...
}
Trong trường hợp bạn hoàn toàn cần phải biết liệu một lớp đang sử dụng một đặc điểm hoặc triển khai nhất định, bạn chỉ có thể thêm một phương thức khác vào giao diện, trả về một giá trị khác dựa trên việc triển khai thực hiện.
Cách tiếp cận này không hữu ích trong trường hợp triển khai thực hiện logic không công khai. Ví dụ, khi bạn cần tạo ra các biến thể hành vi khác nhau với hành vi sử dụng dễ dàng 'hành vi'; sử dụng BehaviorBTrait; 'và nó phải dựa trên một số giao diện phương thức được bảo vệ. Để chắc chắn nó không phải là một thiết kế tốt nhưng nói chuyện về một công cụ linh hoạt. – lazycommit
Câu hỏi đặt ra là về các đặc điểm, không thể thực hiện các giao diện. Đoạn mã trên sẽ chỉ hoạt động đối với các lớp. – Kafoso
Nó không thực sự sạch sẽ và có thể không phải là giải pháp phù hợp cho trường hợp của bạn. Nhưng một sự thay thế là để kiểm tra xem đối tượng hoặc lớp thực hiện một phương pháp của Trait (như thường bạn không ghi đè lên các phương pháp hiện có với Trait)
if (method_exists($my_object, 'MyTraitSpecificMethod')){
...
}
cũng là hack của tôi ... – fico7489
Bạn có thể sử dụng chức năng class_uses
để có được một mảng của tất cả các đặc điểm được sử dụng bởi một lớp học.
Sau đó, bạn kiểm tra xem mảng này có khóa có cùng tên của đặc điểm mà bạn đang thử nghiệm không.
nếu có, thì lớp học của bạn đang sử dụng đặc điểm của bạn. Nếu không, thì không sử dụng.
- 1. Mở rộng các đặc điểm với các lớp trong PHP?
- 2. Cần một ví dụ hoàn chỉnh cho DynamoDB với php
- 3. Các kịch bản sử dụng có thể có cho các đặc điểm trong PHP là gì?
- 4. Ví dụ ngữ cảnh mkdir php
- 5. Biểu diễn UML của đặc điểm PHP
- 6. ví dụ về dịch vụ web php
- 7. Ví dụ PDF tối thiểu trong đặc tả PDF
- 8. PHP: Ví dụ OOP thực tế
- 9. Tesseract Ví dụ cho Iphone
- 10. Ví dụ về các ví dụ điển hình
- 11. Ví dụ thế giới thực của các tính năng OOP nâng cao cho PHP
- 12. Tính đa hình chung với các ví dụ PHP
- 13. loại đặc điểm đặc điểm
- 14. Kiểm tra PHP ví dụ về DateTime?
- 15. Tự động tải các đặc điểm trong PHP
- 16. Ví dụ MonadFix cho Đặt
- 17. xử lý các ký tự đặc biệt, ví dụ: dấu trong R
- 18. C++ 11 is_same loại đặc điểm cho các mẫu
- 19. Gỡ lỗi PHP với Điểm ngắt - nghiên cứu điển hình, ví dụ ..?
- 20. Ví dụ Kéo thả NSCollectionView Ví dụ
- 21. Loại bí danh cho nhiều đặc điểm
- 22. Làm thế nào để thực hiện một đặc điểm cho một đặc điểm tham số
- 23. Lớp ghi đè của Python (không phải ví dụ) Các phương pháp đặc biệt
- 24. Ví dụ thời gian thực cho các loại tài trợ Oauth2, ví dụ cho Oauth2 với Spring MVC
- 25. Đi mẫu ví dụ
- 26. Ví dụ về thời gian khó hiểu javascript Ví dụ
- 27. Knitr thoát các ký tự đặc biệt của latex (ví dụ: ~, $) trong mã R
- 28. Ví dụ về bản vẽ điểm ảnh OpenGL/PBO cần
- 29. tôi thực hiện một đặc điểm cho đặc điểm khác, nhưng không thể gọi các phương thức từ cả hai đặc điểm
- 30. Mẫu PHP - Dịch vụ/Mẫu/Mapper/Ví dụ về Dao?
Có phải không? Theo kiến thức của tôi, nó không ('$ x instanceof SomeTrait' sẽ luôn là false). – kuba
Bản sao có thể có của [cách nhận các đặc điểm được sử dụng trong lớp php?] (Http://stackoverflow.com/questions/13633346/how-to-get-used-traits-in-php-class) – ar34z
'instanceof' là luôn luôn sai với một đặc điểm. đặc điểm không phải là bất kỳ ví dụ nào của một cái gì đó. – Raffaello