PHP – Interfaces

Just as a class is a template for its objects, an **interface** in PHP can be called as a template for classes. We know that when a class is instantiated, the properties and methods defined in a class are available to it. Similarly, an interface in PHP declares the methods along with their arguments and return value. These methods do not have any body, i.e., no functionality is defined in the interface.

Một lớp concrete phải triển khai các phương thức trong giao diện. Nói cách khác, khi một lớp triển khai một giao diện, nó phải cung cấp chức năng cho tất cả các phương thức trong giao diện.

Một interface được định nghĩa theo cách tương tự như một lớp được định nghĩa, ngoại trừ việc từ khóa "interface" được sử dụng thay cho lớp.

interface myinterface {
   public function myfunction(int $arg1, int $arg2);
   public function mymethod(string $arg1, int $arg2);
}

Lưu ý rằng các phương thức bên trong giao diện không được cung cấp chức năng nào. Các định nghĩa của những phương thức này phải được cung cấp bởi lớp thực thi giao diện này.

Khi chúng ta định nghĩa một lớp con, chúng ta sử dụng từ khóa " **extends** ". Trong trường hợp này, lớp mà phải sử dụng từ khóa " **class** ".

Tất cả các phương thức được khai báo trong giao diện phải được định nghĩa, với cùng số lượng và loại đối số cũng như giá trị trả về.

class myclass implements myinterface {
   public function myfunction(int $arg1, int $arg2) {
      ## implementation of myfunction;
   }
   public function mymethod(string $arg1, int $arg2) {
      # implementation of mymethod;
   }
}

Note rằng tất cả các phương thức được khai báo trong một interface phải là public.

Example

Hãy định nghĩa một giao diện gọi là shape . Một hình có một diện tích nhất định. Bạn có các hình dạng với diện mạo hình học khác nhau, chẳng hạn như hình chữ nhật, hình tròn, v.v., mỗi hình đều có diện tích, được tính bằng các công thức khác nhau. Do đó, giao diện hình dạng khai báo một phương thức area() trả về một giá trị kiểu float.

interface shape {
   public function area(): float;
}

Tiếp theo, chúng ta sẽ định nghĩa một lớp hình tròn (circle) thực hiện giao diện hình dạng (shape interface). Để thực hiện, lớp này phải cung cấp một cài đặt cụ thể cho các hàm trong giao diện. Ở đây, hàm area() trong lớp hình tròn tính diện tích của một hình tròn với bán kính cho trước.

class circle implements shape {
   var $radius;
   public function __construct($arg1) {
      $this->radius = $arg1;
   }
   public function area(): float {
      return pow($this->radius,2)*pi();
   }
}

Chúng ta bây giờ có thể khai báo một đối tượng của lớp hình tròn (circle class) và gọi phương thức area().

$cir = new circle(5);
echo "Radius : " . $cir->radius .  " Area of Circle: " . $cir->area(). PHP_EOL;

Một interface có thể được triển khai bởi bất kỳ số lượng lớp nào (có thể không liên quan đến nhau) với điều kiện lớp triển khai cung cấp chức năng cho mỗi phương thức trong interface.

Dưới đây là một lớp Square thực thi giao diện shape. Phương thức area() trả về bình phương của thuộc tính side.

class square implements shape {
   var $side;
   public function __construct($arg1) {
      $this->side = $arg1; 
   }
   public function area(): float {
      return pow($this->side, 2);
   }
}

Tương tự, tạo một đối tượng Square và gọi phương thức area().

Example

Dưới đây là mã hoàn chỉnh cho một giao diện hình dạng, được triển khai bởi các lớp hình tròn và hình vuông −

<?php
   interface shape {
      public function area(): float;
   }

   class square implements shape {
      var $side;
      public function __construct($arg1) {
         $this->side = $arg1; 
      }
      public function area(): float {
         return pow($this->side, 2);
      }
   }
   class circle implements shape {
      var $radius;
      public function __construct($arg1) {
         $this->radius = $arg1;
      }
      public function area(): float {
         return pow($this->radius,2)*pi();
      }
   }

   $sq = new square(5);
   echo "Side: " . $sq->side .  " Area of Square: ". $sq->area() . PHP_EOL;

   $cir = new circle(5);
   echo "Radius: " . $cir->radius .  " Area of Circle: " . $cir->area(). PHP_EOL;
?>

Nó sẽ tạo ra output

Side: 5 Area of Square: 25
Radius: 5 Area of Circle: 78.539816339745

Multiple Inheritance in PHP

PHP không có quy định để xây dựng một lớp con mở rộng từ hai lớp cha. Nói cách khác, câu lệnh −

class child extends parent1, parent2 

không được chấp nhận. Tuy nhiên, PHP hỗ trợ việc có một lớp con mở rộng từ một lớp cha và triển khai một hoặc nhiều giao diện.

Hãy cùng xem ví dụ sau đây cho thấy một lớp mở rộng một lớp khác và triển khai một giao diện.

Đầu tiên, lớp cha là marks. Nó có ba biến thể hiện hoặc thuộc tính $m1, $m2, $m3 đại diện cho điểm số trong ba môn học. Một constructor được cung cấp để khởi tạo đối tượng.

class marks {
   protected int $m1, $m2, $m3;
   public function __construct($x, $y, $z) {
      $this->m1 = $x;
      $this->m2 = $y;
      $this->m3 = $z;
   }
}

Chúng tôi hiện cung cấp một giao diện gọi là percent, trong đó khai báo một phương thức percent(), phương thức này nên trả về một số thực nhưng không có thân hàm.

interface percent {
   public function percent(): float;
}

Chúng tôi hiện đang phát triển một lớp mở rộng lớp marks và cung cấp triển khai cho phương thức percent() trong giao diện.

class student extends marks implements percent {
   public function percent(): float {
      return ($this->m1+$this->m2+$this->m3)*100/300;
   }
}

Lớp sinh viên kế thừa hàm khởi tạo của lớp cha, nhưng cung cấp triển khai cho phương thức parent() trả về tỷ lệ phần trăm điểm số.

Example

Mã hoàn chỉnh như sau −

<?php
   class marks {
      protected int $m1, $m2, $m3;
      public function __construct($x, $y, $z) {
         $this->m1 = $x;
         $this->m2 = $y;
         $this->m3 = $z;
      }
   }
   interface percent {
      public function percent(): float;
   }

   class student extends marks implements percent {
      public function percent(): float {
         return ($this->m1+$this->m2+$this->m3)*100/300;
      }
   }

   $s1 = new student(50, 60, 70);
   echo "Percentage of marks: ". $s1->percent() . PHP_EOL;
?>

Nó sẽ tạo ra output

Percentage of marks: 60

Giao diện trong PHP định nghĩa một khung các phương thức mà các lớp sử dụng để cung cấp một triển khai khác nhưng cụ thể của riêng chúng.