抽象类
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"