2015-06-20 19 views
9

Tại sao không thể có trong PHP 7, để khai báo giao diện có loại trả về static?loại trả về tĩnh trong giao diện PHP 7

Hãy nói rằng tôi có các lớp sau:

interface BigNumber { 
    /** 
    * @param BigNumber $that 
    * 
    * @return static 
    */ 
    public function plus(BigNumber $that); 
} 

class BigInteger implements BigNumber { ... } 
class BigDecimal implements BigNumber { ... } 

Tôi muốn thực thi các kiểu trả về của phương pháp plus()-static, đó là:

  • BigInteger::plus() phải trả lại một BigInteger
  • BigDecimal::plus() phải trả lại BigDecimal

tôi có thể tuyên bố giao diện theo cách sau:

public function plus(BigNumber $that) : BigNumber; 

Nhưng điều đó không thực thi trên. Những gì tôi muốn làm là:

public function plus(BigNumber $that) : static; 

Nhưng PHP 7, cho đến nay, là không hài lòng với nó:

PHP Parse error: syntax error, unexpected 'static' (T_STATIC)

Có một lý do cụ thể cho điều này, hay đây là lỗi mà nên được báo cáo?

+2

Loại bất biến, đó là lý do. Các phương thức triển khai/ghi đè phải khớp chính xác với loại trong PHP; 'static' không - rõ ràng, bởi vì nó đề cập đến ngữ cảnh hiện tại và do đó không thể được invarianced. –

Trả lời

5

Nó không phải là một lỗi, nó chỉ không có ý nghĩa thiết kế khôn ngoan từ một quan điểm lập trình hướng đối tượng.

Nếu số BigIntegerBigDecimal thực hiện cả hai BigNumber, bạn quan tâm đến hợp đồng mà chúng thực hiện. Tôi trường hợp này, đó là giao diện của BigNumber.

Vì vậy, loại trả về bạn nên sử dụng trong giao diện của mình là BigNumber vì bất kỳ ai mã hóa với giao diện đó không biết gì khác ngoài các thành viên của giao diện đó. Nếu bạn cần biết về cái nào được trả về, giao diện có lẽ quá rộng ở nơi đầu tiên.

Lưu ý: ngôn ngữ lập trình với generics có thể đạt được hiệu ứng này bằng cách chỉ định kiểu trả về làm loại chung, nhưng PHP không có generics và có thể sẽ không có trong tương lai gần.

+2

Ý tưởng của tôi là linh hoạt trên đầu vào (bạn có thể so sánh 'BigInteger' với' BigDecimal'), nhưng nghiêm ngặt về đầu ra (bất kỳ phương thức nào được gọi trên lớp nên trả về một thể hiện của cùng một lớp). Có lẽ điều đó không có ý nghĩa tổng thể, nhưng ít nhất PHPdoc cho phép kiểu sử dụng này ('@return static')! – Benjamin

+0

Vâng, PHPDoc thực sự không biết gì về 'static' http://www.phpdoc.org/docs/latest/references/phpdoc/types.html, gần nhất là' self' trong trường hợp này giống hệt với giao diện gợi ý kiểu trả về. – vvondra

+2

Thật kỳ lạ, điều này: http://www.phpdoc.org/docs/latest/guides/types.html thực sự là tài liệu 'tĩnh':" một đối tượng của lớp nơi giá trị này được tiêu thụ, nếu được kế thừa, nó sẽ đại diện cho con (xem phần cuối của liên kết tĩnh trong hướng dẫn sử dụng PHP). " – Benjamin

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