Меню
×
   ❮     
HTML CSS JAVASCRIPT SQL PYTHON PHP КАК
     ❯   

PHP Учебник


PHP Формы


PHP Продвинутый


PHP ООП


MySQL База данных


PHP XML


PHP - AJAX


PHP Примеры


PHP Справочник



PHP ООП - Абстрактные классы



PHP - Абстрактные классы и методы

Абстрактный класс — это класс, который содержит по крайней мере один абстрактный метод. Абстрактный метод — это метод, который объявлен, но не реализован в абстрактном классе. Реализация должна быть выполнена в дочернем классе (или классах).

Цель абстрактного класса — заставить все производные классы (дочерние классы) реализовать абстрактный метод(ы), объявленный в родительском классе.

Абстрактный класс или метод определяется с помощью ключевого слова abstract.

Давайте рассмотрим пример:

Пример

<?php
// Абстрактный базовый класс
abstract class Car {
  public $name;

  // Неабстрактный метод
  public function __construct($name) {
    $this->name = $name;
  }

  // Абстрактный метод - заставляет дочерние классы реализовать его
  abstract public function intro();
}

// Дочерний класс, расширяющий абстрактный класс
class Audi extends Car {
  public function intro() {
    return "Немецкое качество! Я $this->name!";
  }
}

// Дочерний класс, расширяющий абстрактный класс
class Citroen extends Car {
  public function intro() {
    return "Французская экстравагантность! Я $this->name!";
  }
}

// Создаем объекты дочерних классов
$audi = new audi("Audi");
echo $audi->intro();
echo "<br>";

$citroen = new citroen("Citroen");
echo $citroen->intro();
?>
Попробуйте сами »

Пояснение к примеру

Классы Audi и Citroen наследуются от абстрактного класса Car. Это означает, что классы Audi и Citroen могут использовать публичное свойство $name, а также публичный метод __construct() из класса Car благодаря наследованию.

Кроме того, intro() — это абстрактный метод, который должен быть реализован во всех дочерних классах.

Примечания по абстрактным классам

При наследовании от абстрактного класса метод дочернего класса должен быть определен с тем же именем и тем же или менее ограниченным модификатором доступа. Таким образом, если абстрактный метод определен как protected, метод дочернего класса должен быть определен как protected или public, но не private. Кроме того, тип и количество обязательных аргументов должны быть одинаковыми. Однако дочерние классы могут иметь дополнительные необязательные аргументы.

Таким образом, когда дочерний класс наследуется от абстрактного класса, мы имеем следующие правила:

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


PHP - Абстрактный метод с аргументом

Давайте рассмотрим другой пример, где абстрактный метод имеет аргумент:

Пример

<?php
abstract class ParentClass {
  // Абстрактный метод с аргументом
  abstract protected function prefixName($name);
}

class ChildClass extends ParentClass {
  public function prefixName($name) {
    if ($name == "Иван Петров") {
      $prefix = "Г-н";
    } elseif ($name == "Мария Иванова") {
      $prefix = "Г-жа";
    } else {
      $prefix = "";
    }
    return "$prefix $name";
  }
}

$class = new ChildClass;
echo $class->prefixName("Иван Петров");
echo "<br>";
echo $class->prefixName("Мария Иванова");
echo "<br>";
echo $class->prefixName("Дмитрий Сидоров");
?>
Попробуйте сами »

В следующем примере дочерний класс имеет два необязательных аргумента, которые не определены в абстрактном методе родителя:

Пример

<?php
abstract class ParentClass {
  // Абстрактный метод с аргументом
  abstract protected function prefixName($name);
}

class ChildClass extends ParentClass {
  // Дочерний класс может определять необязательные аргументы, которых нет в абстрактном методе родителя
  public function prefixName($name, $separator = ".", $greet = "Уважаемый") {
    if ($name == "Иван Петров") {
      $prefix = "Г-н";
    } elseif ($name == "Мария Иванова") {
      $prefix = "Г-жа";
    } else {
      $prefix = "";
    }
    return "$greet $prefix$separator $name";
  }
}

$class = new ChildClass;
echo $class->prefixName("Иван Петров");
echo "<br>";
echo $class->prefixName("Мария Иванова");
?>
Попробуйте сами »


×

Связаться с отделом продаж

Если вы хотите использовать услуги schoolsw3 как образовательное учреждение, команда или предприятие, отправьте нам электронное письмо:
sales@schoolsw3.com

Сообщить об ошибке

Если вы хотите сообщить об ошибке или внести предложение, отправьте нам электронное письмо:
help@schoolsw3.com

Schoolsw3 оптимизирован для обучения и подготовки. Примеры могут быть упрощены для улучшения чтения и обучения. Учебники, ссылки и примеры постоянно проверяются, чтобы избежать ошибок, но мы не можем гарантировать полную правильность всего контента.
При использовании Schoolsw3 вы соглашаетесь прочитать и принять наши условия использования,
политику использования файлов cookie и конфиденциальности.

Авторское право 1999- © Copyright. Все права защищены. Schoolsw3 работает на SW3.CSS.