一只大脸猫博客主要分享PHP开发技巧、Web前端技术、网站优化、网站排名、修电脑、心灵鸡汤等一些生活中遇到的事、道理和技巧。分享更多知识给身边的朋友。
一只大脸猫博客主要分享PHP开发技巧、Web前端技术、网站优化、网站排名、修电脑、心灵鸡汤等一些生活中遇到的事、道理和技巧。分享更多知识给身边的朋友。

PHP中的「abstract」关键词「抽象」


abstract.jpg

abstract(抽象)

PHP 5 支持抽象类和抽象方法。

定义为抽象的类不能被实例化。

任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。

被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。

继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。

例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的(严格程度:private>protected>public),而不能定义为私有的。

此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。

例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则两者的声明并无冲突。

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

总结:

抽象类不能被实例化;

类中有任何抽象方法那这个类也必须为抽象的;

抽象类只能申明调用方式和参数,不能定义具体功能实现;

继承抽象类的子类必须实现抽象类的所有抽象方法;

子类中实现的抽象方法的访问控制必须比父类的访问控制更严格;

子类中实现的方法的调用方式及参数数量必须与被实现的方法一致。

例:

<?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";
<?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";



PHP中的「abstract」关键词「抽象」:https://www.yzdlm.com/abstract.html

作者:大脸猫 分类: 大脸猫PHP博客


上一篇:PHP 保留关键词列表 下一篇:PHP中常用的魔术方法

评论


乖,登录后才可以留言!
QQ一键登录

相关文章

0、2021-01-13——PHP中常用的魔术方法
1、2020-12-21——PHP中的「abstract」关键词「抽象」
2、2020-11-11——PHP 保留关键词列表
3、2020-06-07——PHP丨PHP基础知识之流程控制WHILE循环「理论篇」
4、2020-06-07——PHP丨PHP基础知识之流程控制for循环「理论篇」
5、2020-06-06——PHP|PHP之代码编写规范
6、2020-03-04—— PHP 设计模式说明|从这里开始学习(设计模式)
7、2019-09-14——Zend创始人提议创建PHP方言,暂命名为P++
8、2019-07-20——PHP开发环境:composer 下载扩展包慢怎么办?
9、2019-07-18——Composer -- PHP依赖管理的新时代
10、2019-06-12——PHP 7新特性五 Spread operator(数组延展操作符)
11、2019-06-01——为什么大家总喜欢黑PHP?PHP到底做错了什么
12、2019-05-24——PHP 7新特性四 Typed properties (属性类型化)
13、2019-05-24——PHP 7 新特性三 Traits
14、2019-05-23——PHP 7 新特性二 Null coalescing operator(空合并运算符)
15、2019-05-23——PHP 7新特性一 Short closures 短闭包
16、2019-05-21——PHP早已不是十年前的鸟样
Top