PHP 抽象类


在本教程中,我们将学习PHP的抽象类和抽象方法,以及如何使用抽象类来定义类的层次结构框架。

抽象方法和抽象类介绍

在继承层次结构中,子类实现特定的细节,而父类定义了框架。父类还提供将由其子类实现的公共方法的模板。为了使父类更加通用和抽象,PHP提供了抽象方法和抽象类

抽象方法是没有实现的方法。要创建抽象方法,你可以使用abstract关键字。如下所示:

1
abstract public function abstractMethod();

抽象类是至少包含一个抽象方法的类。要声明抽象类,一样也是使用abstract关键字,如下所示:

1
2
3
4
5
<?php
abstract class abstractClass{
abstract public function abstractMethod();
//.. 其他方法和属性
}

PHP抽象类示例

让我们看一个例子来了解抽象类和抽象方法是如何工作的。我们将基于以下结构开发新类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
abstract class Person{
protected $firstName;
protected $lastName;
 
public function __construct($firstName,$lastName){
$this->firstName = $firstName;
$this->lastName = $lastName;
}
 
public function __toString(){
return sprintf("%s, %s",$this->lastName, $this->firstName);
}
 
abstract public function getSalary();
}

抽象类无法被实例化。换句话说,不允许创建一个抽象类的新实例,例如,下面的代码是不允许的:

1
$p = new Person('Alice','theITroad');

抽象类可以包含属性,比如$firstname和$lastname等。

抽象类可以包含已经实现完成的方法,比如:__tostring()方法。

抽象类允许您声明一个部分功能已经实现了的类。而抽象方法则由子类来实现。

继承自抽象类的类被称为具体类,例如Employee类和Contractor类就是具体类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
require_once 'classes/person.php';
class Employee extends Person {
private $salary;
public function __construct($firstName, $lastName, $salary) {
parent::__construct($firstName, $lastName);
$this->salary = $salary;
}
public function getSalary() {
return $salary;
}
public function __toString() {
return sprintf("Name: %s<br> Salary: $%0.2f",
parent::__toString(),
$this->salary);
}
}

下面代码演示了如何使用Employee类:

1
2
3
4
5
6
<?php
 
require_once 'classes/employee.php';
 
$e = new Employee('Alice','theITroad',3000);
echo $e;

我们现在可以开发另一个具体类Contractor:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
require_once 'classes/person.php';
class Contractor extends Person {
private $rate;
private $billableHours;
public function __construct($firstName, $lastName, $rate, $billableHours) {
parent::__construct($firstName, $lastName);
$this->rate = $rate;
$this->billableHours = $billableHours;
}
public function getSalary() {
return $this->rate * $this->billableHours;
}
public function __toString() {
return sprintf("姓名:%s<br>薪水:$%0.2f",
parent::__toString(),
$this->getSalary());
}
}

使用Contractor类的示例代码:

1
2
3
4
5
<?php
require_once 'classes/contractor.php';
 
$c = new Contractor('MStech', 'Bill', 55, 170);
echo $c;


原文链接:https://codingdict.com/