描述:
PHP 5 支援抽象類和抽象方法。定義為抽象的類不能被例項化。任何一個類,如果它裡面至少有一個方法是被宣告為抽象的,那麼這個類就必須被宣告為抽象的。被定義為抽象的方法只是宣告瞭其呼叫方式(引數),不能定義其具體的功能實現。
繼承一個抽象類的時候,子類必須定義父類中的所有抽象方法;另外,這些方法的訪問控制必須和父類中一樣(或者更為寬鬆)。例如某個抽象方法被宣告為受保護的,那麼子類中實現的方法就應該宣告為受保護的或者公有的,而不能定義為私有的。此外方法的呼叫方式必須匹配,即型別和所需引數數量必須一致。例如,子類定義了一個可選引數,而父類抽象方法的宣告裡沒有,則兩者的宣告並無衝突。 這也適用於 PHP 5.4 起的建構函式。在 PHP 5.4 之前的建構函式宣告可以不一樣的。
Example 1: 抽象類示例
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
{
protected function getValue()
{
return "ConcreteClass2";
}
public function prefixValue($prefix)
{
return "{$prefix}ConcreteClass2";
}
}
$class1 = new ConcreteClass1();
$class1->printOut();//ConcreteClass1
echo $class1->prefixValue('FOO_') . "\n";//FOO_ConcreteClass1
$class2 = new ConcreteClass2();
$class2->printOut();//ConcreteClass2
echo $class2->prefixValue('FOO_');////FOO_ConcreteClass2
Example 2: 抽象類示例
abstract class AbstractClass
{
// 我們的抽象方法僅需要定義需要的引數
abstract protected function prefixName($name);
}
class ConcreteClass extends AbstractClass
{
// 我們的子類可以定義父類簽名中不存在的可選引數
public function prefixName($name, $separator = '.')
{
if($name == 'Pacman'){
$prefix = 'Mr';
} else if($name == 'Pacwoman'){
$prefix = 'Mrs';
} else {
$prefix = '';
}
return "{$prefix}{$separator} {$name}";
}
}
$o = new ConcreteClass();
echo $o->prefixName('Pacman'), "\n";//Mr. Pacman
echo $o->prefixName('Pacwoman');//Mrs. Pacwoman
本作品採用《CC 協議》,轉載必須註明作者和本文連結