抽象类

PHP 支持抽象类和抽象方法。定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。继承一个抽象类的时候,子类必须定义父类中的所有抽象方法。另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。如果子类定义了一个可选参数,而父类抽象方法的声明里没有,则两者的声明并无冲突。

<?php

abstract class Foo
{
    /**
     * Just an abstract method.
     *
     * @param  string $string
     * @return string
     */
    abstract protected function method(string $string): string;

    /**
     * Return a string.
     *
     * @param  void
     * @return string
     */
    public function test(): string
    {
        return 'foo';
    }
}

class Bar extends Foo
{
    /**
     * Override the abstract method.
     *
     * @param  string $string
     * @return string
     */
    public function method(string $string): string
    {
        return $string;
    }
}

class Baz extends Foo
{
    /**
     * Override the abstract method.
     *
     * @param  string    $string
     * @param  bool|null $option
     * @return string
     */
    public function method(string $string, ?bool $option = null): string
    {
        return $string;
    }

    /**
     * Override the parent method.
     *
     * @param  void
     * @return string
     */
    public function test(): string
    {
        return 'baz';
    }
}

$bar = new Bar();
var_dump($bar->method('bar')); // string(3) "bar"
var_dump($bar->test());        // string(3) "foo"

$baz = new Baz();
var_dump($baz->method('baz')); // string(3) "baz"
var_dump($baz->test());        // string(3) "baz"

抽象类中也可以定义常量。抽象类中的常量和类常量的使用完全相同,也可以被子类重写。

<?php

abstract class Foo
{
    /**
     * Just a test constant.
     *
     * @var string
     */
    public const CONSTANT = 'foo';
}

class Bar extends Foo
{
    /**
     * Override the parent constant.
     *
     * @var string
     */
    public const CONSTANT = 'bar';
}

class Baz extends Foo
{
    /**
     * Override the parent constant.
     *
     * @var string
     */
    public const CONSTANT = 'baz';
}

var_dump(Foo::CONSTANT); // string(3) "foo"
var_dump(Bar::CONSTANT); // string(3) "bar"
var_dump(Baz::CONSTANT); // string(3) "baz"

results matching ""

    No results matching ""