PHP – 介面



正如類是其物件的模板一樣,PHP 中的介面可以被稱為類的模板。我們知道,當例項化一個類時,類中定義的屬性和方法都可用。同樣,PHP 中的介面聲明瞭方法及其引數和返回值。這些方法沒有任何主體,即介面中沒有定義任何功能。

一個具體類必須實現介面中的方法。換句話說,當一個類實現一個介面時,它必須為介面中的所有方法提供功能。

介面的定義方式與類的定義方式相同,只是用關鍵字“interface”代替了 class。

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

請注意,介面內部的方法沒有提供任何功能。這些方法的定義必須由實現此介面的類提供。

當我們定義子類時,我們使用關鍵字“extends”。在這種情況下,該類必須使用關鍵字“implements”。

介面中宣告的所有方法都必須定義,並且引數數量和型別以及返回值必須相同。

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

注意,介面中宣告的所有方法都必須是公共的。

示例

讓我們定義一個名為shape的介面。形狀有一定的面積。您有不同幾何形狀的形狀,例如矩形、圓形等,每個形狀都有一個面積,用不同的公式計算。因此,shape 介面聲明瞭一個返回浮點值的方法 area()。

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

接下來,我們將定義一個實現 shape 介面的 circle 類,為了實現,該類必須提供介面中函式的具體實現。在這裡,circle 類中的 area() 函式計算給定半徑的圓的面積。

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

我們現在可以宣告一個 circle 類的物件,並呼叫 area() 方法。

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

只要實現類提供了介面中每個方法的功能,任何數量的類(可能彼此無關)都可以實現一個介面。

這是一個實現 shape 的 Square 類。area() 方法返回 side 屬性的平方。

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

同樣,建立一個 Square 物件並呼叫 area() 方法。

示例

以下是 shape 介面的完整程式碼,由 circle 和 Square 類實現:

<?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;
?>

它將產生以下輸出

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

PHP 中的多重繼承

PHP 沒有構建擴充套件兩個父類的子類的規定。換句話說,語句:

class child extends parent1, parent2 

不被接受。但是,PHP 確實支援具有擴充套件一個父類並實現一個或多個介面的子類。

讓我們來看下面的例子,它展示了一個擴充套件另一個類並實現一個介面的類。

首先,父類 marks。它有三個例項變數或屬性 $m1、$m2、$m3,分別代表三門科目的分數。提供了一個建構函式來初始化物件。

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

現在我們提供一個名為 percent 的介面,它宣告一個方法 percent(),該方法應該返回一個浮點數,但沒有函式體。

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

現在我們開發一個擴充套件 marks 類併為介面中的 percent() 方法提供實現的類。

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

student 類繼承了父建構函式,但提供了 parent() 方法的實現,該方法返回分數的百分比。

示例

完整的程式碼如下:

<?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;
?>

它將產生以下輸出

Percentage of marks: 60

PHP 中的介面定義了一個方法框架,類使用該框架提供他們自己不同的具體實現。

廣告