Рубрики
Uncategorized

Подробное объяснение разницы между абстрактным классом PHP и интерфейсом

Автор оригинала: David Wong.

В этой статье описываются различия между абстрактными классами PHP и интерфейсами. Чтобы поделиться с вами для вашей справки, следующим образом:

Абстрактный класс

концепция

Класс, определенный как абстрактный, не может быть создан. Если метод любого класса объявлен абстрактным, класс должен быть объявлен абстрактным.

При наследовании абстрактного класса дочерний класс должен определять все абстрактные методы в родительском классе, и управление доступом к этим методам должно быть таким же или более мягким, чем в родительском классе.

Например, если абстрактный метод объявлен защищенным, то реализация в подклассе должна быть объявлена защищенной или общедоступной вместо частной.

Метод должен вызываться одним и тем же способом, то есть тип и количество требуемых параметров должны быть одинаковыми. Например, если подкласс определяет необязательный параметр, а абстрактный метод родительского класса не имеет объявления, объявление этих двух не конфликтует.

Характеристика

  • Абстрактное наследование классов с использованием ключевого слова extends.
  • Абстрактные классы могут объявлять различные переменные, константы и методы.
  • Абстрактные классы могут иметь конструкторы.
  • Методы в абстрактных классах могут быть общедоступными, защищенными и частными.
  • Класс может наследовать только один абстрактный класс.

Пример

Пример 1

php
// abstract class
abstract class AbstractClasss
{
  //Force subclasses to define these methods
  abstract protected function getValue();
  abstract protected function prefixValue();
  //Common method (non abstract method)
  public function printOut() 
  {
    print $this->getValue() . "\n";
  }
}
// subclass
class ConcreteClassOne extends AbstractClass
{
  protected function getValue()
  {
    return "ConcreteClassOne";
  }
  public function prefixValues($prefix)
  {
    return "{$prefix}ConcreteClassOne";
  }
}
// subclass
class ConcreteClassTwo extends AbstractClass
{
  protected function getValue()
  {
    return "ConcreteClassTwo";
  }
  public function prefixValue($prefix)
  {
    return "{$prefix}ConcreteClassTwo";
  }
}
//Instantiate first subclass
$classOne = new ConcreteClassOne;
$classOne->printOut();
echo $classOne->prefixValue('FOO_') . "\n";
//Instantiate the second subclass
$classTwo = new ConcreteClassTwo;
$classTwo->printOut();
echo $classTwo->prefixValue('FOO_') . "\n";

Результат вывода

Бетонный класс Один Фут_бетонный Класс Один

Бетон Второго класса Фут_бетон Второго класса

Пример второй

prefixName("Pacman") . "\n";
echo $class->prefixName("Pacwoman") . "\n";

Результат вывода

Мистер Пакман Миссис, Пакман

Интерфейс

концепция

С помощью интерфейса интерфейса вы можете указать, какие методы должен реализовывать класс, но вам не нужно определять конкретное содержимое этих методов.

Для реализации интерфейса с помощью оператора implements все методы, определенные в интерфейсе, должны быть реализованы в классе.

Характеристика

  • Реализация интерфейса с использованием ключевого слова реализует.
  • Переменные не могут быть объявлены в интерфейсе, но константы могут быть объявлены.
  • В интерфейсе нет конструктора.
  • Методы в интерфейсе по умолчанию являются общедоступными.
  • Класс может реализовывать несколько интерфейсов.

Пример

Пример 1. Интерфейс реализации

vars[$name] = $var;
  }
  public function getHtml($template)
  {
    foreach($this->vars as $name => $value) {
      $template = str_replace('{' . $name . '}', $value, $template);
    }
    return $template;
  }
}
//The following writing method is wrong and will report an error, because gethtml() is not implemented
// Fatal error: Class BadTemplate contains 1 abstract methonds
// and must therefore be declared abstaract (iTemplate::getHtml)
class BadTemplate implements iTemplate
{
  private $vars = array();
  public function setVariable($name, $var)
  {
    $this->vars[$name] = $var;
  }
}

Пример 2. Расширяемый интерфейс

Пример 3. Наследование нескольких интерфейсов

Пример 4. Использование констант интерфейса

Для получения дополнительной информации о PHP, пожалуйста, ознакомьтесь со следующими разделами: Введение в объектно-ориентированное программирование PHP, навыки работы с массивами PHP, введение в базовый синтаксис PHP, краткое описание операций PHP и использования операторов, краткое описание использования строк PHP, введение в работу с базой данных PHP + MySQL и общие навыки работы с базой данных PHP

Я надеюсь, что эта статья будет полезна для программирования на PHP.