2010-11-13 38 views
6

thể trùng lặp:
What is the point of interfaces in PHP?Tại sao tôi nên tạo Giao diện trong PHP?

Tại sao tôi nên tạo giao diện trong PHP?

Như tôi đã hiểu, các giao diện ở đó để mô tả các lớp triển khai chúng. Các lớp phải chứa ít nhất các hàm này. Điều này là tốt nếu bạn xây dựng dựa trên công việc của người khác, hoặc phải duy trì mức độ tương thích. Nhưng trong trường hợp đơn giản hơn?

Tôi biết, đối với các ngôn ngữ lập trình được biên dịch, như C++, việc sử dụng giao diện cho phép tăng tốc độ biên dịch, nhưng PHP thì sao? Lợi thế này dường như biến mất, vì PHP được hiểu, thay vì biên dịch.

+0

Tôi từng nghĩ về nó như thế này, nhưng PHP được biên dịch sang bytecode, thực sự. Khi bạn thực thi một kịch bản, điều đầu tiên xảy ra là biên dịch. Đó là lý do tại sao bạn có thể sử dụng bộ đệm bytecode như APC. – JAL

+0

Giao diện được sử dụng thay cho nhiều thừa kế. Trong PHP cụ thể, họ cũng có thể cung cấp một vài tính năng cú pháp trên các đối tượng, xem các lớp SPL hoặc ArrayAccces. – mario

+0

trùng lặp của [Điểm giao diện trong PHP là gì?] (Http://stackoverflow.com/questions/20463/what-is-the-point-of-interfaces-in-php) – Gordon

Trả lời

1

Có thể ví dụ thế giới thực sẽ giúp minh họa điều này. Hãy tưởng tượng bạn cần xây dựng một loạt các lớp ghi nhật ký ghi lại các thông báo tới các phương tiện khác nhau như một tệp văn bản, XML hoặc một cơ sở dữ liệu. Mỗi lớp cần phải có mã riêng để tương tác với các loại lưu trữ khác nhau của khóa học. Tuy nhiên, nếu tất cả chúng đều thực hiện cùng một giao diện, 'khuôn mặt chung' mà chúng hiển thị cho mã khác luôn giống nhau. Theo cách đó, mã khác sử dụng các đối tượng ghi nhật ký không cần phải biết lớp nào là trường hợp của chúng hoặc phương tiện lưu trữ là gì. Tất cả những gì họ cần biết là tất cả các lớp ghi nhật ký, nhờ vào thực tế là tất cả chúng đều thực hiện cùng một giao diện, chia sẻ một API chung. Đây có thể là một cách làm việc rất hiệu quả. Bạn có thể xây dựng một thư viện mã giải quyết các vấn đề liên quan theo nhiều cách khác nhau và chỉ đơn giản là 'cắm và chạy' các mã này trong mã của bạn.

+0

Cảm ơn! Điều này làm cho nó rõ ràng hơn rất nhiều đối với tôi. Mặc dù các câu trả lời khác chứa rất nhiều thông tin bổ sung, đây là điều khiến tôi khó hiểu. –

1

Giao diện là cách 'mô phỏng' đa thừa kế. Một lớp trong PHP có thể chỉ mở rộng một lớp cha, nhưng có thể thực hiện bất kỳ số lượng giao diện nào, do đó cho phép bạn tạo các đối tượng có nhiều loại khác nhau.

1

Giao diện được sử dụng để mở rộng/mô phỏng hành vi PHP lõi, như trình vòng lặp, truy cập mảng, v.v. Đây là điều chính mà giao diện cung cấp cho bạn ... nghĩa là bạn không thể thực hiện theo bất kỳ cách nào khác.

Bạn cũng có thể sử dụng giao diện để thực thi kiểm tra thông số:

function foo(MyInterface $obj) 
{ 
} 

Trong khi không phải là hữu ích như kiểm tra thời gian biên dịch mà bạn sẽ đạt được bằng ngôn ngữ khác (ví dụ, C++), kiểm tra thời gian chạy có thể vẫn rất hữu ích trong việc giảm thiểu lỗi.

Cuối cùng, giao diện có thể đơn giản hóa một số logic bằng cách sử dụng hàm is_a hoặc toán tử instanceof. Bạn chỉ có thể kiểm tra xem đối tượng "trừu tượng" có triển khai một giao diện nhất định hay không và sau đó thực hiện điều gì đó phù hợp.

+0

Câu trả lời của bạn không chính xác. Thi đua/Mở rộng hành vi PHP cốt lõi ??? Giao diện được sử dụng để thực thi một API chuẩn trong các lớp con. Bạn có thể chuyển sang một lớp khác và sẽ không có bất kỳ sự không tương thích nào nếu được triển khai đúng. –

+0

Hoặc là bạn không biết gì hoặc chỉ đơn giản là là người theo dõi. ví dụ: Nếu bạn muốn đối tượng của mình mô phỏng (mở rộng, bắt chước, hành động như, bất kỳ thứ gì bạn thích) một Mảng thông qua cú pháp mảng '[]', bạn phải triển khai giao diện ArrayAccess. Không có cách nào khác để làm điều đó. Có rất nhiều giao diện tích hợp khác cung cấp các móc nối vào chức năng PHP cốt lõi. – Matthew

0

Việc sử dụng giao diện không liên quan gì đến tốc độ và sẽ không bao giờ xảy ra. Nhưng nó có rất nhiều để làm với tách và trừu tượng hóa.

Bạn sẽ sử dụng chúng trong PHP:

  1. Để ẩn thực hiện - thiết lập một giao thức truy cập vào một lớp học của các đối tượng một sự thay đổi việc thực hiện cơ bản mà không refactoring trong tất cả những nơi mà bạn đã sử dụng mà các đối tượng
  2. Để kiểm tra loại - như để đảm bảo rằng thông số có loại cụ thể $object instanceof MyInterface
  3. Để thực thi kiểm tra tham số khi chạy - hãy xem @konforce answer
  4. Để thực hiện nhiều hành vi thành một lớp đơn lẻ)

    class Car thực hiện EngineInterface, BodyInterface, SteeringInterface {

để một đối tượng Car ca tại start(), stop() (EngineInterface) hoặc goRight(), goLeft() (giao diện chỉ đạo)

và khác những điều tôi không thể nghĩ ra ngay bây giờ

Từ tư duy trong Java:

Giao diện cho biết, “Đây là những gì tất cả các lớp triển khai giao diện cụ thể này sẽ như thế.” Do đó, bất kỳ mã nào sử dụng giao diện cụ thể đều biết phương thức nào có thể được gọi cho giao diện đó. Vì vậy, giao diện được sử dụng để thiết lập một "giao thức" giữa các lớp.

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