Абстрактный класс - это класс, объект которого не может быть создан. Как правило, аннотация abstract определяет интерфейс для расширения других классов.
Чтобы определить абстрактный класс, вы добавляете ключевое слово abstract следующим образом:
<?php
abstract class className
{
// ...
}
Абстрактный класс может иметь свойства и методы как обычный класс. Но нельзя создать объект этого класса.
Подобно абстрактному классу, абстрактный метод - это метод, не имеющий реализации. Чтобы определить абстрактный метод, вы также используете ключевое слово abstract перед сигнатурой метода, например:
abstract function methodName(arguments);
В большинстве случаев абстрактный класс будет содержать по крайней мере один абстрактный метод, хотя это не обязательно. Если класс содержит один или несколько абстрактных методов, он должен быть абстрактным классом.
Если класс расширяет абстрактный класс, он должен реализовывать все абстрактные методы или сам быть объявлен абстрактным.
В следующем примере определяется абстрактный класс с именем Dumper, который имеет абстрактный метод dump():
<?php
abstract class Dumper
{
abstract public function dump($data);
}
Чтобы отобразить информацию в для веб-приложения, вы можете расширить класс Dumper.
Ниже определяется класс WebDumper, расширяющий класс Dumper. Поскольку класс Dumper имеет абстрактный метод dump(), класс WebDumper должен реализовать метод dump():
<?php
abstract class Dumper
{
abstract public function dump($data);
}
class WebDumper extends Dumper
{
public function dump($data)
{
echo '<pre>';
var_dump($data);
echo '</pre>';
}
}
Создадим новый экземпляр класса WebDumper и вызовем метод dump():
$webDumper = new WebDumper();
$webDumper->dump('PHP abstract class is awesome!');
Если вы откроете веб-браузер, вы увидите, что сообщение находится внутри тега <pre>:
string(30) "PHP abstract class is awesome!"
Позже, если вы захотите вывести информацию в командную строку, вы можете определить класс, например, ConsoleDumper, который расширяет класс Dumper:
<?php
class ConsoleDumper extends Dumper
{
public function dump($data)
{
var_dump($data);
}
}
Метод dump() ConsoleDumper вызывает функцию var_dump () для вывода информации в командную строку.
Эта диаграмма UML иллюстрирует отношения между классами Dumper, WebDumper и ConsoleDumper:
Далее определим класс DumperFactory, который имеет статический метод getDumper().
Метод getDumper() возвращает новый объект WebDumper, если сценарий выполняется на веб-сервере, и объект ConsoleDumper, если сценарий выполняется в командной строке:
class DumperFactory
{
public static function getDumper()
{
return PHP_SAPI === 'cli'
? new ConsoleDumper()
: new WebDumper();
}
}
Используем DumperFactory для получения Dumper в зависимости от того, где запускается скрипт, и отображения сообщения:
$dumper = DumperFactory::getDumper();
$dumper->dump('PHP abstract class is awesome!');
Если вы запустите сценарий в веб-браузере, вы увидите следующее сообщение, красиво заключенное в тег <pre>:
string(30) "PHP abstract class is awesome!"
Однако, если вы запустите скрипт с помощью PHP CLI, вы увидите только сообщение без тега <pre>.
<?php
abstract class Dumper
{
abstract public function dump($data);
}
class WebDumper extends Dumper
{
public function dump($data)
{
echo '<pre>';
var_dump($data);
echo '</pre>';
}
}
class ConsoleDumper extends Dumper
{
public function dump($data)
{
var_dump($data);
}
}
class DumperFactory
{
public static function getDumper()
{
return PHP_SAPI === 'cli'
? new ConsoleDumper()
: new WebDumper();
}
}
$dumper = DumperFactory::getDumper();
$dumper->dump('PHP abstract class is awesome!');