UNPKG

manual-php

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