Php 简明教程

PHP – Abstract Classes

PHP 中的保留字列表包括“abstract”关键字。当用“abstract”关键字定义一个类时,它不能被实例化,即,你不能声明这样的类的对象。抽象类可以由另一个类扩展。

abstract class myclass {
   // class body
}

如上所述,你可以 cannot declare an object of this class 。因此,下面的语句 -

$obj = new myclass;

将导致一个 error 消息,如下所示 -

PHP Fatal error:  Uncaught Error: Cannot instantiate abstract class myclass

一个抽象类可能包含属性、常量或方法。类成员可以是 public、private 或 protected 类型的。一个类中的一个或更多方法也可以被定义为抽象的。

如果一个类中的任何方法是抽象的,类本身必须是一个抽象类。换句话说,一个普通的类不能有在其中定义的抽象方法。

这会产生一个 error -

class myclass {
   abstract function myabsmethod($arg1, $arg2);
   function mymethod() #this is a normal method {
      echo "Hello";
   }
}

error message 将被显示为 -

PHP Fatal error:  Class myclass contains 1 abstract method
and must therefore be declared abstract

你可以使用一个抽象类作为一个父类并用一个子类扩展它。但是,子类必须为父类中的每一个抽象方法提供具体的实现,否则会遇到错误。

Example

在以下代码中, myclass 是一个 abstract classmyabsmethod() 作为其 abstract method 。它派生的类是 mynewclass ,但它没有实现其父类中的抽象方法。

<?php
   abstract class myclass {
      abstract function myabsmethod($arg1, $arg2);
      function mymethod() {
         echo "Hello";
      }
   }
   class newclass extends myclass {
      function newmethod() {
         echo "World";
      }
   }
   $m1 = new newclass;
   $m1->mymethod();
?>

在这种情况下 error message -

PHP Fatal error:  Class newclass contains 1 abstract method and must
therefore be declared abstract or implement the remaining
methods (myclass::myabsmethod)

它表明新类应该实现抽象方法或者应该被声明为抽象类。

Example

在以下 PHP 脚本中,我们有 marks 作为抽象类,其中 percent() 是其中一个抽象方法。另一个 student 类扩展了 marks 类并实现了其 percent() 方法。

<?php
   abstract class marks {
      protected int $m1, $m2, $m3;
      abstract public function percent(): float;
   }

   class student extends marks {
      public function __construct($x, $y, $z) {
         $this->m1 = $x;
         $this->m2 = $y;
         $this->m3 = $z;
      }
      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

Difference between Interface and Abstract Class in PHP

PHP 中抽象类的概念与接口非常相似。但是,接口和抽象类之间有几个不同之处。

Abstract class

Interface

用 abstract 关键字定义抽象类

用 interface 关键字定义接口

抽象类不能被实例化

Interface cannot be instantiated.

抽象类可能具有普通和抽象方法

接口必须声明具有参数和返回类型的 method 不是任何主体。

抽象类由子类扩展,后者必须实现所有抽象方法

接口必须由另一个类实现,该类必须提供接口中所有方法的功能。

可以具有公共、私有或受保护的属性

不能在接口中声明属性