[Day18] 抽象类别

抽象类别

PHP也支援抽象类的和抽象方法,被定义为抽象类的方法不能被实体化,在任何一个类别中,
如果他至少有一个方法被声明为抽象,那这个类必须要被声明为抽象类。被定义为抽象类的方法只能声明他该怎麽使用,不能定义具体功能实现。

当有类别继承抽象类别时,子类别必须要定义父类别中的所以抽象方法,另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法是被声明为受保护的,那麽子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。

此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则两者的声明并无冲突。

这也适用於 PHP 5.4 起的构造函数。在 PHP 5.4 之前的构造函数声明可以不一样的。

1. 抽象类范例1

<?php
abstract class AbstractClass
{
 // 子类必须定义这些方法,否则会出错
    abstract protected function getValue();
    abstract protected function prefixValue($prefix);

    // 普通方法(非抽象方法)
    public function printOut() {
        print $this->getValue() . "\n";
    }
}

class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}

class ConcreteClass2 extends AbstractClass
{
    public function getValue() {
        return "ConcreteClass2";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass2";
    }
}

$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."\n";

$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') ."\n";
?>

// outputs
// ConcreteClass1
// FOO_ConcreteClass1
// ConcreteClass2
// FOO_ConcreteClass2

2. 抽象类范例2

<?php
abstract class AbstractClass
{
    // 我们的抽象方法仅需要定义需要的参数
    abstract protected function prefixName($name);

}

class ConcreteClass extends AbstractClass
{

    // 子类的方法可以定义父类方法中不存在的可选参数,不冲突
    public function prefixName($name, $separator = ".") {
        if ($name == "Pacman") {
            $prefix = "Mr";
        } elseif ($name == "Pacwoman") {
            $prefix = "Mrs";
        } else {
            $prefix = "";
        }
        return "{$prefix}{$separator} {$name}";
    }
}

$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "\n";
echo $class->prefixName("Pacwoman"), "\n";
?>

// outputs
// Mr. Pacman
// Mrs. Pacwoman

资料来源: https://www.php.net/


<<:  Day 19 你有设定「排除关键字」吗?

>>:  Consistency and Consensus (3-3) - Total Order Broadcast

DAY1-EXCEL统计分析:前言

统计在现代社会中是不可或缺的,而更重要的是经过统计後的分析。不论在各行各业皆需要专业且精密的统计分析...

DAY14 - 第三个小范例 : 虚拟货币爬虫

前言 今天是铁人赛的第十四天,这次要来写一下虚拟货币的爬虫 对象是meme虚拟货币界的霸主:狗狗币 ...

iOS工程师面试深入浅出(OC)- @property 使用方法?Copy 什麽时候用?

iOS工程师面试深入浅出(OC)- @property 使用方法?Copy 什麽时候用? 如果本来是...

Day 4 - 类神经网路(二)

形式神经元变形 (原文网址:https://kknews.cc/tech/z34j3rg.html)...

CMoney软件工程师战斗营_专题制作接api与tool分享_Week 18

接着我将赶在记忆模糊之前来讲述第18周 也就是制作专题的第3周 谢天谢地在本周,各组後端除了部署完成...