PHP 抽象类

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

抽象方法和抽象类介绍

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

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

abstract public function abstractMethod();

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

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

PHP抽象类示例

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

<?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();
}

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

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

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

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

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

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

<?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类:

<?php
 
require_once 'classes/employee.php';
 
$e = new Employee('Alice','theITroad',3000);
echo $e;

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

<?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类的示例代码:

<?php
require_once 'classes/contractor.php';
 
$c = new Contractor('MStech', 'Bill', 55, 170);
echo $c;
日期:2018-11-15 15:15:25 来源:oir作者:oir