2015-04-16 17 views
11

Tôi đến từ C# và tôi đang cố gắng tìm ra cách làm cho mã của tôi có thể mở rộng được.Sử dụng giao diện trong PHP

Ví dụ: tôi có chức năng tính trợ cấp hàng ngày được đề nghị của tôi về lượng thức ăn. Nó nhìn vào các vitamin, calo, khoáng chất, vv ...

Tôi muốn có nhiều đối tượng thực phẩm khác nhau mà tôi sử dụng trong ứng dụng của mình và các chức năng khác nhau nhìn vào các khía cạnh khác nhau của thực phẩm. các lớp thực phẩm mà tôi muốn tương thích với chức năng của tôi thực hiện nó. sau đó tôi tuyên bố rằng chức năng của tôi mất nó như một arg

function GetRda(IFoodNutrition $food){} 

Trong C# tôi sẽ xác định tất cả các tài sản mà tôi cần phải sử dụng trong giao diện vì vậy tôi biết bất kỳ lớp mà thực hiện này sẽ tương thích với chức năng này.

Điều khiến đầu tôi bị tổn thương là PHP chỉ cho phép chữ ký phương thức trong giao diện.

Vấn đề của tôi rõ ràng là sự thay đổi mô hình. Tôi không chắc mô hình tương đương là gì trong PHP. Tôi đã đọc các tài liệu và tôi không thể nhìn thấy giống như cho thay thế trừ khi bạn kế thừa từ một lớp trừu tượng nhưng sau đó bạn chỉ có thể kế thừa từ một lớp để không hoạt động theo cùng một cách.

Vì PHP không an toàn nên tôi không phải tạo giao diện. Ai đó chỉ có thể gửi bất kỳ đối tượng nào cho phương thức và nếu nó có các thuộc tính cần thiết ở định dạng đúng, nó sẽ hoạt động. Điều này dường như không phù hợp với tôi mặc dù tôi đã quen với việc đặt ra cách mọi thứ nên được tương tác với nhau trong các giao diện. Tôi cảm thấy như ít nhất phải có thêm một số bước ở giữa, nơi đối tượng được xác nhận và một số cấu trúc rõ ràng mà một nhà phát triển có thể xem và sau đó thực hiện lớp của mình một cách trực quan và xem lỗi trước khi chạy.

Có một mẫu cụ thể trong PHP như thế này không?

+1

PHP (kể từ phiên bản 5.1) cho phép [gợi ý kiểu cho đối tượng, mảng, giao diện và cuộc gọi] (http://php.net/manual/en/language.oop5.typehinting.php), không chỉ cho giao diện. Có [là một gợi ý để thêm gợi ý kiểu cho các loại vô hướng tới PHP 7] (https://wiki.php.net/rfc/scalar_type_hints), nhưng nó đã được rút ra. Hiện tại, không có cách nào an toàn để đảm bảo an toàn kiểu trong PHP. Ghi lại các kiểu được chấp nhận cho các tham số của bạn, sử dụng các gợi ý kiểu nếu có thể, và kiểm tra xem hàm của bạn có các kiểu mong đợi và ném các ngoại lệ cho phù hợp hay không. – Carsten

Trả lời

6

PHP chỉ cho phép chữ ký phương thức trong giao diện.

Điều này đúng. Tuy nhiên, không có gì ngăn bạn tạo các getters và setters truyền thống cho các thuộc tính như một phần của giao diện. Làm như vậy tóm tắt các chi tiết triển khai cơ bản.

Ai đó chỉ có thể gửi bất kỳ đối tượng nào đến phương pháp và nếu có thuộc tính cần thiết ở đúng định dạng, nó sẽ hoạt động.

Điều này không đúng. Bạn có type-hinted đối số với IFoodNutrition $food. PHP sẽ ném một lỗi nghiêm trọng nếu hàm này nhận được một đối tượng không thực hiện giao diện IFoodNutrition.

+1

Việc phát sinh lỗi trên loại không hợp lệ không làm cho loại ngôn ngữ an toàn. 7 sẽ đi một chặng đường dài hướng tới mục tiêu đó, nhưng vẫn sẽ không được an toàn. Để làm được điều đó, bạn cần nhiều khả năng dự đoán hơn cho WHOLE xung quanh các chuyển đổi, v.v. – ircmaxell

+0

@ircmaxell, bạn đã cho tôi biết về ngữ nghĩa liên quan đến * loại an toàn *. Tuy nhiên, đối với câu hỏi, * Ai đó có thể gửi bất kỳ đối tượng nào đến phương thức và nếu nó có các thuộc tính cần thiết ở định dạng đúng, nó sẽ hoạt động. * Vẫn không đúng. –

+0

Chắc chắn, đó là lý do tại sao tôi không downvote hoặc viết câu trả lời của riêng tôi. Những gì bạn đang nói là trên điểm, chỉ cần các chi tiết ngữ nghĩa là hơi tắt, do đó tại sao tôi đã cố gắng giúp đỡ bằng cách giải thích các điểm pedantic trong bình luận. :-D – ircmaxell

0

Kiến thức PHP của tôi vẫn còn hạn chế, nhưng tôi sẽ thử một vài câu trả lời về cách tôi giải quyết vấn đề này.

1. nhanh chóng và dơ bẩn (không khuyến khích, IMHO, không lớn không có)

chấp nhận tất cả mọi thứ trên đầu vào, thất bại với một ngoại lệ nếu đầu vào là không hợp lệ.

 
    function getRda ($food) { 

     if (!($food instanceof IInterface)) { 
      throw new \Exception('function argument should be instance of IInterface'); 

     } 

    //... do your magic 
    } 

2. đề nghị getter và setter thông qua giao diện

Trong giao diện, đề nghị sự hiện diện của một tài sản (ví dụ getMinerals với $ khoáng chất)

3. sử dụng một đặc điểm

Mặc dù nó sẽ không giúp bạn nhiều với việc thiết lập một hợp đồng giữa các tương tác đối tượng, nó sẽ giúp bạn giữ cho bạn mã DRY

ví dụ

trait Food 
{ 
    protected $minerals; 
    public function getMinerals() 
    { 
     return $this->minerals; 
    } 
} 

sau đó, trong mỗi lớp bạn muốn nhiều thừa kế (tương đương, giả sử, mở rộng hai lớp trừu tượng), hãy sử dụng đặc điểm ở trên.

+0

Bạn có thể sử dụng các đặc tính trong các đặc điểm không? – Guerrilla

+0

vâng, tất nhiên: http://php.net/manual/en/language.oop5.traits.php –

+0

Xin lỗi có gì sai khi thực hiện 'hàm getRda (thực phẩm $ 2 giao diện)' –

0

Bạn không thể xác định thuộc tính trong giao diện bằng php.

Điều đó có ý nghĩa, bởi vì chức năng của giao diện là chỉ định một API, không phải là việc triển khai.

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