Giao diện mở rộng lớp PHP

Hôm qua, một câu hỏi đã xuất hiện trên Reddit về mục đích của các giao diện trong PHP. Mặc dù tôi đến bữa tiệc quá muộn để đưa ra câu trả lời cho chủ đề đó (ít nhất điều đó sẽ được mọi người chú ý), tôi nghĩ đó là một chủ đề trò chuyện tuyệt vời

Vì vậy, hãy xem các giao diện trong PHP

Các giao diện rất giống với các lớp, ngoại trừ có ít tính năng hơn. Trên thực tế, chỉ có hai điều bạn có thể làm trong một giao diện

  1. Xác định sơ khai phương thức công khai hoặc chữ ký phương thức công khai không có nội dung và
  2. Mở rộng giao diện khác

Điều này kết thúc trông giống như

3 định nghĩa hai phương thức

  1. 4 từ cha mẹ 
    5
  2. 6 từ chính nó

Một lần nữa, các phương thức này không thể có phần thân trong một giao diện. Vậy đâu là sự hữu ích trong việc này?

Ghi chú. bạn không cần phải đặt tên cho giao diện có hậu tố là

7. Ở đây, tôi chỉ tuân theo các nguyên tắc đặt tên tiện dụng được sử dụng nội bộ bởi PHP Framework Interop Group (PHP-FIG). Bạn có thể đặt tên cho chúng theo cách mà trái tim bạn mong muốn

Triển khai giao diện

Khi một lớp bình thường triển khai một giao diện, nó phải triển khai tất cả các phương thức được định nghĩa trong giao diện đó. Theo nghĩa này, đôi khi nó được mô tả như một hợp đồng vì để sử dụng giao diện, lớp mở rộng phải tuân theo hợp đồng của giao diện đó

Tất nhiên, một lớp triển khai có thể triển khai các phương thức khác bên ngoài giao diện, nhưng ít nhất nó phải triển khai tất cả các phương thức đó

Vậy nếu chúng ta muốn sử dụng

0 thì sao?

1 từ khóa. Nó rất giống với việc mở rộng các lớp khác, nhưng chỉ hoạt động với các giao diện. Từ khóa 
2 cũng cho phép chúng ta triển khai nhiều giao diện, trong khi mở rộng trong PHP chỉ cho phép bạn mở rộng một lớp

Lớp

3 được yêu cầu triển khai cả hai phương thức 
4 và 
6 của lớp 
0. Nó phải tuân thủ hợp đồng của giao diện

Nhưng một lần nữa. làm thế nào là điều này hữu ích?

Tiêm phụ thuộc

Để xem một trong những ứng dụng lớn nhất của giao diện, trước tiên chúng ta phải đi đường vòng và thảo luận về chủ đề tiêm phụ thuộc

Dependency injection loại bỏ việc quản lý hoặc khởi tạo các phụ thuộc khỏi lớp bằng cách sử dụng phụ thuộc đó, lớp phụ thuộc và trao nó cho một số cơ quan bên ngoài, thường là cơ chế chịu trách nhiệm khởi tạo lớp phụ thuộc

Về cơ bản, với việc tiêm phụ thuộc hoặc các phụ thuộc được trao cho chúng tôi, thay vì chúng tôi tạo ra chúng

Vì vậy, nếu trước đây bạn có một lớp trông như thế này

customerQuery = new CustomerQuery();
  }
}

Với phép nội xạ phụ thuộc, lớp này sẽ được cấu trúc lại để trông giống như

________số 8

Bây giờ, thay vì khởi tạo sự phụ thuộc của chúng ta,

3, chúng ta được cung cấp hoặc tiêm vào, sự phụ thuộc này. Rõ ràng điều này đặt ra câu hỏi “làm thế nào để 
3 được khởi tạo và chuyển đến 
9? 

Đây là một thay đổi có vẻ nhỏ, nhưng nó mở ra một thế giới khả năng cho mã của chúng tôi

  1. Giờ đây, chúng tôi có thể trao đổi các triển khai của
    3 mà không cần thay đổi mã bằng cách sử dụng nó (gần như, chúng tôi có thêm một thay đổi nữa để thực hiện chỉ trong một giây). Và vì điều này,
  2. Giờ đây, chúng ta có thể kiểm tra
    9 dễ dàng hơn nhiều và tách biệt bằng cách chế nhạo đối tượng 
    3 thay vì khởi tạo nó và có khả năng bật lên một phiên bản cơ sở dữ liệu chỉ để kiểm tra bộ điều khiển của chúng ta
  3. Mã của chúng tôi bây giờ biểu cảm hơn. Dễ dàng hơn để nói rằng nó phụ thuộc vào
    3 vì chúng ta phải vượt qua nó khi khởi tạo nó. Trước đây, khi chưa đào sâu vào mã, chúng tôi không biết các phụ thuộc của lớp này có thể là gì

Thế là lần thứ ba. làm thế nào điều này làm cho giao diện hữu ích?

Gợi ý loại giao diện

Trong ví dụ trước đây của chúng tôi về phép nội xạ phụ thuộc, chúng tôi đã sử dụng một gợi ý kiểu trong hàm tạo cho

3. Hãy nhớ rằng, 
3 là một triển khai cụ thể của giao diện 
0

Chúng ta có thể thực hiện việc tái cấu trúc này thêm một bước nữa và thay vì nhập gợi ý triển khai cụ thể, thay vào đó chúng ta có thể nhập gợi ý cho

customerQuery = new CustomerQuery();
  }
}
7

________số 8

Đây là nơi khái niệm tuân thủ hợp đồng thực sự phát huy tác dụng.

customerQuery = new CustomerQuery();
  }
}
8 của chúng tôi tuyên bố rằng nó yêu cầu một phiên bản của
0. Nó không quan tâm nó nhận được phiên bản cụ thể nào của giao diện này, chỉ cần nó nhận được thứ gì đó với các phương thức mà nó mong đợi

Điều này cho phép chúng tôi tách rời bộ điều khiển của mình khỏi triển khai thực tế và chỉ cần ghép nối bộ điều khiển đó với thông số kỹ thuật. Hơn nữa, nó cho phép chúng tôi trao đổi triển khai cụ thể với một triển khai khác mà không phải thay đổi bất kỳ điều gì với mã sử dụng nó

Điều này làm cho các giao diện đặc biệt hữu ích và mạnh mẽ trong PHP

Giao diện là hợp đồng

Chỉ cần đặt. giao diện là hợp đồng mà một số mã triển khai và tuân theo và mã khác phụ thuộc vào. Nó cho phép chúng tôi đảm bảo rằng bất kỳ sự phụ thuộc nhất định nào cũng sẽ thực hiện các phương thức mà chúng tôi mong đợi. Hơn nữa, với PHP 7 sắp tới, chúng ta cũng có thể sử dụng các gợi ý kiểu (đối tượng và vô hướng) và trả về các kiểu để đảm bảo hơn nữa rằng việc triển khai cụ thể tuân thủ các hợp đồng

Kiểm tra bài viết của tôi về Triển khai Kiến trúc Onion trong PHP để biết thêm ví dụ về cách sử dụng các giao diện để đạt được mã tách rời, được kiến ​​trúc rõ ràng

Một giao diện có thể mở rộng một lớp PHP không?

Các giao diện có thể được mở rộng giống như các lớp bằng cách sử dụng toán tử mở rộng . Ghi chú. Lớp triển khai giao diện phải khai báo tất cả các phương thức trong giao diện với chữ ký tương thích. Một lớp có thể triển khai nhiều giao diện khai báo một phương thức có cùng tên.

Một giao diện có thể mở rộng lớp không?

Một giao diện có thể mở rộng các giao diện khác , giống như một lớp con của lớp hoặc mở rộng một lớp khác. Tuy nhiên, trong khi một lớp chỉ có thể mở rộng một lớp khác, một giao diện có thể mở rộng bất kỳ số lượng giao diện nào.

Giao diện có mở rộng đối tượng không?

Đối tượng là một lớp và các giao diện không thể mở rộng các lớp , vì vậy "không" - giao diện không kế thừa bất kỳ thứ gì từ bất kỳ lớp nào.

Lớp trừu tượng có thể triển khai giao diện PHP không?

Giao diện có thể bao gồm các phương thức và hằng số trừu tượng, nhưng không thể chứa các phương thức và biến cụ thể. Tất cả các phương thức trong giao diện phải nằm trong phạm vi hiển thị công khai. Một lớp có thể triển khai nhiều hơn một giao diện, trong khi nó chỉ có thể kế thừa từ một lớp trừu tượng .