【PHP】关于抽象类
抽象类是什么意思。
抽象类是通过abstract关键字定义的,具有以下特征。
-
対象の具象クラス(※通常のクラス)にプロパティもしくはメソッドを強制的に定義させる
抽象クラス単体ではインスタンス化することはできない
abstractとして定義したメソッドは具体的な処理を書くことはできない
抽象クラス内で具象クラス同様、具体的なメソッドを定義し、継承させることもできる
请参考以下抽象类的例子,其中引用了PHP公式参考手册中的代码示例。
abstract class AbstractClass // 抽象クラス
{
// 拡張クラスに以下のメソッドの定義を強制する
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// 通常のメソッド
public function printOut() {
print $this->getValue() . "\n";
}
}
class ConcreteClass extends AbstractClass // 具象クラス
{
protected function getValue() { // AbstractClassで定義したabstractメソッド
return "ConcreteClass";
}
public function prefixValue($prefix) { // AbstractClassで定義したabstractメソッド
return "{$prefix}ConcreteClass";
}
}
$class = new ConcreteClass;
$class->printOut(); // => 'ConcreteClass"'
echo $class->prefixValue('FOO_') ."\n"; // => 'FOO_ConcreteClass'
在上述示例中,
具体类ConcreteClass继承了抽象类AbstractClass。
在ConcreteClass中,显式定义了抽象类AbstractClass中所定义的三个方法中的抽象方法getValue和prefixValue。
此外,printOut方法可以像普通继承一样,在具体类内部不定义也可以调用。
如果在ConcreteClass类内未定义这两个方法,则会发生以下错误。
class ConcreteClass extends AbstractClass
{
}
// => Fatal error: Class ConcreteClass contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (AbstractClass::getValue, AbstractClass::prefixValue) in /tmp/preview on line 15
如果只是简单的继承,即使没有明确定义也可以调用,
但是在继承了抽象类的具体类中,
如果不定义抽象方法就会发生错误,
因此必须通过继承具体类来强制显式定义属性和方法。
摘要的重要性和目的
为什么要专门创建抽象类并让具体类继承它来强制定义属性和方法呢?因为这对团队开发非常有用。
在继承抽象类的具体类中,有一个规则必须遵守,就是必须定义抽象属性和方法。这样可以保证它是派生类具有共同功能,减少功能的缺失。此外,继承的类群也可以更明确地表明它们都是具有相似功能的类。
随着项目规模的增长和开发人员数量的增加,从文件名和类名等方面推测其功能变得更加重要。抽象类在这方面起到了辅助的作用。