2010-06-15 47 views
13

Tại sao có thể tạo giao diện mà không chỉ định kiểu trả về? Tại sao điều này không làm cho giao diện này không sử dụng được?Tại sao có thể có một giao diện không có kiểu trả về trong PHP?

này làm cho nó rõ ràng hơn:

Interface run 
{ 
    public function getInteger(); 
} 

class MyString implements run 
{  
    public function myNumber() 
    { 

    } 

    public function getInteger() 
    { 
     return "Not a number"; 
    }  
} 

Trong Java mỗi giao diện có một kiểu trả về như Integer, String hoặc Void

Tôi biết rằng PHP là một ngôn ngữ không may loại lỏng lẻo nhưng không có ở đó một giải pháp cho vấn đề đó?

Có thể xác định Giao diện có loại trả lại như Integer không?

+0

@streeetparade, tôi đã cố gắng để làm cho câu hỏi của bạn rõ ràng hơn một chút, các chỉnh sửa của tôi có phù hợp với bạn không? –

Trả lời

19

Loại gián tiếp cho chức năng/đối số phương pháp hoặc trả lại giá trị chỉ được hỗ trợ tại PHP7.0 hay muộn

Kiểm tra các chi tiết ở đây: http://php.net/manual/en/migration70.new-features.php

Nếu bạn đang sử dụng PHP5 nên thực hành được chấp nhận hiện nay là sử dụng phpdoc ý kiến ​​để chỉ ra "hợp đồng" có mặt.

/** 
* Does something. 
* @return int 
**/ 
public function getInteger() { return 1; } 

Nếu mã vi phạm "hợp đồng", tôi khuyên bạn nên tìm kiếm các coder gốc và họ có cho sửa chữa nó và/hoặc nộp một lỗi và/hoặc sửa chữa nó cho mình nếu nó trong codebase của riêng bạn.

+5

RFC được liệt kê trong câu trả lời này đã lỗi thời. Một RFC gần đây hơn là [ở đây] (https://wiki.php.net/rfc/return_types). Nó đã được chấp nhận và có mặt trong PHP7. – Scopey

5

Không, không có. Bạn đã nói lý do chính mình: PHP được nhập sai.
Bạn có thể có gợi ý trong PHPDoc, hoặc kiểm tra loại trong hàm bạn sử dụng các chức năng của giao diện và ném một InvalidArgumentException nếu bạn nhận được một cái gì đó khác nhưng một số nguyên.

0

Trong và của chính nó những gì bạn muốn là không thể ...

Tóm lại: Nếu bạn thực sự cần phải thực thi các loại trở lại trong hợp đồng mã của bạn, sử dụng một ngôn ngữ tĩnh gõ.

Nhưng nhờ vào sự kỳ diệu của __get, __set, __call và bạn bè, bạn có thể định nghĩa một lớp cơ sở đó thực thi an toàn kiểu (tôi không muốn giới thiệu này cho bất cứ điều gì khác hơn là nghiên cứu/giờ chơi) nhưng điều đó sẽ vẫn không giúp bạn xác định loại giao diện an toàn.

5

Cần lưu ý rằng điều này hoàn toàn có thể với PHP7 (chỉ Beta1 đã được phát hành tại thời điểm viết bài)

Có thể với cú pháp sau:

interface Run 
{ 
    public function getInteger(): int; 
} 

class MyString implements Run 
{  
    public function myNumber() 
    { 

    } 

    public function getInteger() 
    { 
     return "Not a number"; 
     // Throws a fatal "Catchable fatal error: Return value of getInteger() must be of the type integer, string returned in %s on line %d" 
    }  
} 
Các vấn đề liên quan