PHP – 接口(Interfaces)


就像类是其对象的模板一样,PHP 的 接口(Interfaces) 也可以作为类的模板调用。我们知道,当一个类被实例化时,类中定义的属性和方法对它可用。

同样,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) {
      ## myfunction 的实现;
   }
   public function mymethod(string $arg1, int $arg2) {
      # mymethod 的实现;
   }
}

注意:接口中声明的所有方法都必须是 public

示例

我们定义一个名为 shape 的接口。形状具有特定区域。您有不同几何形状的形状,例如矩形、圆形等,每个形状都有一个面积,使用不同的公式计算。因此,shape 接口声明了一个返回 float 值的方法 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() 方法。

示例

下面给出的是形状接口的完整代码,由 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 "侧面: " . $sq->side .  " 平方面积: ". $sq->area() . PHP_EOL;

   $cir = new circle(5);
   echo "半径: " . $cir->radius .  " 圆的面积: " . $cir->area(). PHP_EOL;
?>

它将产生以下输出 -

侧面: 5 平方面积: 25
半径: 5 圆的面积: 78.539816339745

PHP 多重继承

PHP 没有构建扩展两个父类的子类的功能。换句话说 -


class child extends parent1, parent2 

上面这个语句不成立。但是,PHP 确实支持使用扩展一个父类的子类,并实现一个或多个接口。

让我们看看下面示例,该示例显示了一个扩展另一个类并实现接口的类。

首先,父类 marks.它有三个实例变量或属性 $m 1、$m 2、$m 3,分别表示三个主题中的分数。提供了一个构造函数来初始化对象。


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 构造函数,但提供了返回分数百分比的 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 "分数百分比: ". $s1->percent() . PHP_EOL;
?>

它将产生以下输出 -

分数百分比: 60

PHP 接口定义了一个方法框架,类可以使用这些框架来提供自己的不同但具体的实现。