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 class , myabsmethod() 作为其 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 不是任何主体。 |
抽象类由子类扩展,后者必须实现所有抽象方法 |
接口必须由另一个类实现,该类必须提供接口中所有方法的功能。 |
可以具有公共、私有或受保护的属性 |
不能在接口中声明属性 |