В PHP 5 са реализирани абстрактни класове и методи. Не е възможно инстанциирането на клас дефиниран като абстрактен. Всеки клас, който съдържа поне един абстрактен метод, трябва също да се дефинира като абстрактен. Методите, декларирани като абстрактни, имат прототип, но не и имплементация.
При наследяване от абстрактен клас, всички методи декларирани като абстрактни в родителския клас трябва да бъдат дефинирани в дъщерния клас; освен това, тези методи трябва да бъдат със същата (или по-малко рестриктивна) видимост. Например ако абстрактният метод е дефиниран като protected, имплементацията на функцията трябва да бъде дефинирана като protected или public, но не и private.
Example #1 Пример за абстрактни класове
<?php
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
{
public function getValue() {
return "ConcreteClass2";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass2";
}
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."\n";
$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') ."\n";
?>
Примерът по-горе ще изведе:
ConcreteClass1 FOO_ConcreteClass1 ConcreteClass2 FOO_ConcreteClass2
Стар код, в който няма потребителски-дефинирани функции или класове с името 'abstract', ще работи без да са нужни промени по него.