Sử dụng giao diện trong PHP

Tại sao bạn cần một giao diện, nếu đã có các lớp trừu tượng?

Một trong những vấn đề như vậy

"Vấn đề kim cương" (đôi khi được gọi là "vấn đề kim cương chết người") là một sự nhập nhằng phát sinh khi hai lớp B và C kế thừa từ A và lớp D kế thừa từ cả B và C. Nếu có một phương thức trong A mà B và C đã ghi đè và D không ghi đè lên phương thức đó thì D sẽ kế thừa phiên bản nào của phương thức đó. của B hay của C?

Nguồn.

Tại sao/Khi nào nên sử dụng một giao diện? . Tất cả các xe ô tô trên thế giới đều có cùng một giao diện (phương thức). AccelerationPedalIsOnTheRight(), BrakePedalISOnTheLeft(). Hãy tưởng tượng rằng mỗi thương hiệu xe hơi sẽ có những "phương pháp" khác với thương hiệu khác. BMW sẽ có Phanh ở bên phải và Honda sẽ có phanh ở bên trái bánh xe. Mọi người sẽ phải tìm hiểu cách thức hoạt động của những "phương pháp" này mỗi khi họ mua một nhãn hiệu ô tô khác. Đó là lý do tại sao nên có cùng một giao diện ở nhiều "nơi. "

Một giao diện làm gì cho bạn (tại sao một người nào đó thậm chí sẽ sử dụng một giao diện)?

// Methods inside this interface must be implemented in all classes which implement this interface.
interface IPersonService
{   
    public function Create($personObject);
}

class MySqlPerson implements IPersonService
{
    public function Create($personObject)
    {
        // Create a new person in MySql database.
    }
}

class MongoPerson implements IPersonService
{
    public function Create($personObject)
    {
        // Mongo database creates a new person differently then MySQL does. But the code outside of this method doesn't care how a person will be added to the database, all it has to know is that the method Create() has 1 parameter (the person object).
    }
}

Bằng cách này, phương thức Create() sẽ luôn được sử dụng theo cùng một cách. Không thành vấn đề nếu chúng ta đang sử dụng lớp MySqlPerson hoặc lớp MongoPerson. Cách chúng ta đang sử dụng một phương thức vẫn giữ nguyên (giao diện vẫn giữ nguyên)

Ví dụ: nó sẽ được sử dụng như thế này (ở mọi nơi trong mã của chúng tôi)

new MySqlPerson()->Create($personObject);
new MongoPerson()->Create($personObject);

Bằng cách này, một cái gì đó như thế này không thể xảy ra

new MySqlPerson()->Create($personObject)
new MongoPerson()->Create($personsName, $personsAge);

Việc nhớ một giao diện và sử dụng cùng một giao diện ở mọi nơi sẽ dễ dàng hơn nhiều so với nhiều giao diện khác nhau

Bằng cách này, phần bên trong của phương thức Create() có thể khác nhau đối với các lớp khác nhau mà không ảnh hưởng đến mã "bên ngoài", gọi phương thức này. Tất cả mã bên ngoài phải biết là phương thức Create() có 1 tham số (

new MySqlPerson()->Create($personObject);
new MongoPerson()->Create($personObject);
0), bởi vì đó là cách mã bên ngoài sẽ sử dụng/gọi phương thức. Mã bên ngoài không quan tâm đến những gì đang xảy ra bên trong phương thức;

Bạn cũng có thể làm điều này mà không cần giao diện, nhưng nếu bạn sử dụng giao diện thì sẽ "an toàn" hơn (vì nó ngăn bạn mắc lỗi). Giao diện đảm bảo với bạn rằng phương thức Create() sẽ có cùng chữ ký (cùng loại và cùng số lượng tham số) trong tất cả các lớp triển khai giao diện. Bằng cách này, bạn có thể chắc chắn rằng BẤT KỲ lớp nào triển khai giao diện

new MySqlPerson()->Create($personObject);
new MongoPerson()->Create($personObject);
2, sẽ có phương thức Create() (trong ví dụ này) và sẽ chỉ cần 1 tham số (
new MySqlPerson()->Create($personObject);
new MongoPerson()->Create($personObject);
0) để được gọi/sử dụng

Tóm lược. trong hướng dẫn này, bạn sẽ tìm hiểu về giao diện PHP và cách sử dụng giao diện để xác định hợp đồng giữa các lớp

Giới thiệu về giao diện PHP

Một giao diện cho phép bạn chỉ định một hợp đồng mà một lớp phải thực hiện. Để xác định giao diện, bạn sử dụng từ khóa

interface MyInterface { const CONSTANT_NAME = 1; public function methodName(); }

Code language: HTML, XML (xml)
0 như sau

interface MyInterface { //... }

Code language: HTML, XML (xml)

Một giao diện bao gồm các phương thức không chứa cài đặt. Nói cách khác, tất cả các phương thức của giao diện là các phương thức trừu tượng. Một giao diện cũng có thể bao gồm các hằng số. Ví dụ

interface MyInterface { const CONSTANT_NAME = 1; public function methodName(); }

Code language: HTML, XML (xml)

Lưu ý rằng tất cả các phương thức trong giao diện phải được công khai

Khi bạn định nghĩa một lớp (lớp con) sử dụng lại các thuộc tính và phương thức của lớp khác (lớp cha), lớp con sẽ mở rộng lớp cha

Tuy nhiên, đối với các giao diện, chúng ta nói rằng một lớp cài đặt một giao diện.  

Một lớp chỉ có thể kế thừa từ một lớp. Howeer, nó có thể thực hiện nhiều giao diện

Để xác định một lớp triển khai giao diện, bạn sử dụng từ khóa 

interface MyInterface { const CONSTANT_NAME = 1; public function methodName(); }

Code language: HTML, XML (xml)
1 như sau

interface MyInterface { const CONSTANT_NAME = 1; public function methodName(); } class MyClass implements MyInterface { public function methodName() { // ... } }

Code language: HTML, XML (xml)

Khi một lớp cài đặt một giao diện, nó được gọi là một lớp cụ thể. Lớp cụ thể cần triển khai tất cả các phương thức của giao diện

Giống như một lớp, một giao diện có thể mở rộng một giao diện khác bằng cách sử dụng từ khóa

interface MyInterface { const CONSTANT_NAME = 1; public function methodName(); }

Code language: HTML, XML (xml)
2. Ví dụ sau đây cho thấy cách giao diện

interface MyInterface { const CONSTANT_NAME = 1; public function methodName(); }

Code language: HTML, XML (xml)
3 mở rộng giao diện

interface MyInterface { const CONSTANT_NAME = 1; public function methodName(); }

Code language: HTML, XML (xml)
4

interface Readable { public function read(); } interface Document extends Readable { public function getContents(); }

Code language: PHP (php)

Tại sao bạn nên sử dụng giao diện PHP?

Sau đây là những lý do để sử dụng giao diện

  • Bằng cách triển khai một giao diện, người gọi đối tượng chỉ cần quan tâm đến giao diện của đối tượng, không phải việc triển khai các phương thức của đối tượng. Do đó, bạn có thể thay đổi việc triển khai mà không ảnh hưởng đến người gọi giao diện
  • Một giao diện cho phép các lớp không liên quan triển khai cùng một bộ phương thức, bất kể vị trí của chúng trong hệ thống phân cấp kế thừa lớp
  • Một giao diện cho phép bạn lập mô hình nhiều kế thừa vì một lớp có thể triển khai nhiều hơn một giao diện

Ví dụ về giao diện PHP

Trong ví dụ sau, chúng tôi sẽ hướng dẫn bạn cách sử dụng giao diện để làm cho hệ thống linh hoạt hơn và dễ dàng mở rộng hơn. Giả sử bạn phải tạo một trình ghi nhật ký có thể ghi lại một tin nhắn

Đầu tiên, tạo một giao diện có tên là

interface MyInterface { const CONSTANT_NAME = 1; public function methodName(); }

Code language: HTML, XML (xml)
5 như sau

interface Logger { public function log($message); }

Code language: HTML, XML (xml)

Thứ hai, tạo một lớp

interface MyInterface { const CONSTANT_NAME = 1; public function methodName(); }

Code language: HTML, XML (xml)
6 để ghi các thông báo nhật ký vào một tệp

interface Logger { public function log($message); } class FileLogger implements Logger { private $handle; private $logFile; public function __construct($filename, $mode = 'a') { $this->logFile = $filename; // open log file for append $this->handle = fopen($filename, $mode) or die('Could not open the log file'); } public function log($message) { $message = date('F j, Y, g:i a') . ': ' . $message . "\n"; fwrite($this->handle, $message); } public function __destruct() { if ($this->handle) { fclose($this->handle); } } }

Code language: HTML, XML (xml)

Thứ ba, sử dụng lớp

interface MyInterface { const CONSTANT_NAME = 1; public function methodName(); }

Code language: HTML, XML (xml)
6 như sau

$logger = new FileLogger('./log.txt', 'w'); $logger->log('PHP interfae is awesome');

Code language: HTML, XML (xml)

Sau đây thêm một logger ghi thông tin vào cơ sở dữ liệu. Đối với mục đích trình diễn, chúng tôi làm cho lớp

interface MyInterface { const CONSTANT_NAME = 1; public function methodName(); }

Code language: HTML, XML (xml)
8 đơn giản nhất có thể

class DatabaseLogger implements Logger { public function log($message) { echo sprintf("Log %s to the database\n", $message); } }

Code language: HTML, XML (xml)

Và bạn có thể dễ dàng thêm các loại trình ghi nhật ký khác triển khai giao diện

interface MyInterface { const CONSTANT_NAME = 1; public function methodName(); }

Code language: HTML, XML (xml)
5 mà không cần chạm vào trình ghi nhật ký hiện có

Đoạn mã sau trình bày cách sử dụng nhiều logger cùng một lúc bằng một giao diện

interface MyInterface { const CONSTANT_NAME = 1; public function methodName(); } class MyClass implements MyInterface { public function methodName() { // ... } }

Code language: HTML, XML (xml)
0

$loggers = [ new FileLogger('./log.txt'), new DatabaseLogger() ]; foreach ($loggers as $logger) { $logger->log('Log message'); }

Code language: PHP (php)

Đặt nó tất cả cùng nhau

interface Logger { public function log($message); } class FileLogger implements Logger { private $handle; private $logFile; public function __construct($filename, $mode = 'a') { $this->logFile = $filename; // open log file for append $this->handle = fopen($filename, $mode) or die('Could not open the log file'); } public function log($message) { $message = date('F j, Y, g:i a') . ': ' . $message . "\n"; fwrite($this->handle, $message); } public function __destruct() { if ($this->handle) { fclose($this->handle); } } } class DatabaseLogger implements Logger { public function log($message) { echo sprintf("Log %s to the database\n", $message); } } // examle 1 $logger = new FileLogger('./log.txt', 'w'); $logger->log('PHP interfae is awesome'); // example 2 $loggers = [ new FileLogger('./log.txt'), new DatabaseLogger() ]; foreach ($loggers as $logger) { $logger->log('Log message'); }

Code language: HTML, XML (xml)

Lưu ý rằng trong ứng dụng trong thế giới thực, bạn nên tách các giao diện và lớp trong các tệp riêng biệt

Việc sử dụng giao diện là gì?

Giao diện hữu ích cho những việc sau. Nắm bắt điểm tương đồng giữa các lớp không liên quan mà không ép buộc giả tạo mối quan hệ lớp . Khai báo các phương thức mà một hoặc nhiều lớp dự kiến ​​sẽ thực hiện. Tiết lộ giao diện lập trình của đối tượng mà không tiết lộ lớp của nó.

Lợi ích của việc sử dụng giao diện là gì?

Sử dụng một giao diện mạnh mẽ hơn nhiều so với triển khai một phương thức trong nhiều lớp , bởi vì nếu mỗi lớp triển khai cùng một giao diện, bạn có thể xử lý .