Php 简明教程

PHP – Interfaces

正如类是其对象的一个模板一样,PHP 中的 interface 可称为类模板。我们知道当一个类被实例化时,该类中定义的属性和方法对它可用。类似地,PHP 中的接口声明了方法及其参数和返回值。这些方法没有任何方法体,即在接口中没有定义任何功能。

一个 concrete 类必须实现接口中的方法。换句话说,当一个类实现一个接口时,它必须为接口中的所有方法提供功能。

接口的定义方式与类的定义方式相同,只是使用了关键字 interface 来代替类。

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

Note 在接口中声明的所有方法都必须为公共方法。

Example

让我们定义一个名为 shape 的接口。形状具有一定的面积。你有不同几何形状的形状,如矩形、圆形等,每个形状都有一个面积,使用不同的公式计算。因此形状接口声明了一个方法 area(),该方法返回一个浮点值。

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

接下来,我们将定义一个实现形状接口的圆形类,为了实现,该类必须提供接口中函数的具体实现。此处,圆形类中的 area() 函数计算给定半径的圆的面积。

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

现在我们可以声明一个圆形类的对象并调用 area() 方法。

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

一个接口可以由任意数量的类(它们可能彼此无关)实现,只要实现类提供接口中每个方法的功能即可。

这里有一个实现形状的 Square 类。area() 方法返回边属性的平方。

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

类似地,创建一个 Square 对象并调用 area() 方法。

Example

以下是形状接口的完整代码,由圆形和 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;
?>

它将生成以下 output

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

Multiple Inheritance in PHP

PHP 无法建立扩展两个父类的子类。换句话说,该语句 −

class child extends parent1, parent2

不受支持。但是,PHP 支持扩展一个父类并实现一个或多个接口的子类。

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

首先,父类标记。它具有三个实例变量或属性 $m1、$m2、$m3,分别表示三个科目中的分数。提供了一个 constructor 来初始化对象。

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() 方法的实现,该方法返回分数的百分比。

Example

完整代码如下所示:

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

它将生成以下 output

Percentage of marks: 60

PHP 中的接口定义了一个方法框架,用于类提供自己的不同但具体的实现。