2016-04-09 19 views
9

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

+10

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

+1

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

+1

'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

Trả lời

20

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.

+1

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

+1

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

5

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')){ 
    ... 
} 
+0

cũng là hack của tôi ... – fico7489

13

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.

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