Абстрактный класс отличие от интерфейса php

PHP: Разница между Трейтом, Интерфейсом и Абстрактным классом

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

Если вы постоянно работаете с PHP, то скорее всего сталкивались с Интерфейсом, Трейтом или Абстрактным классом. На первый взгляд может показаться, что между ними есть некоторое сходство, и трудно определить их различия и варианты использования. К концу этой статьи вы легко сможете сказать, что отличает их друг от друга и когда предпочтительнее использовать один или другой.

  • Абстрактный класс может содержать сигнатуры методов, а также общие методы, но не может быть создан сам по себе. Хорошо подходит для создания общего родителя для совместного использования между классами.
  • Трейт — группа свойств и методов для повторного использования кода, и в один класс можно добавить несколько. Хорошо подходит для организации кода и уменьшения повторений.
  • Интерфейс — набор сигнатур методов для обеспечения конкретной реализации в классе, к которому они добавляются. Хорошо подходит для добавления структуры и стандартизации.

Хотите узнать больше о каждом из них? Читайте дальше!

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

Абстрактный класс по структуре похож на обычный класс, но содержит абстрактные методы. В отличие от обычного класса не может быть создан сам по себе. Является хорошей отправной точкой для классов, которые, скорее всего, будут иметь общего родителя.

Читайте также:  Css grid flexbox bootstrap

Допустим у нас были классы Cat , Dog и Hamster . У них могут быть общие методы и функциональные возможности, поэтому можно создать родительский абстрактный класс как для добавления общих методов, так и для обеспечения необходимой реализации в дочерних классах.

Родительский абстрактный класс для них может выглядеть так:

 
abstract class Pet

abstract protected function greet();

public function hasFur()

return true;
>
>

У нас есть абстрактный метод greet() , который заставляет любой класс расширяющий Pet реализовать этот метод. Затем у нас есть публичный метод hasFur() , который будет доступен для любого объекта, созданного из класса, расширяющего этот абстрактный класс.

Итак, теперь мы можем создать класс для определённого вида домашних животных:

 
class Cat extends Pet

public function greet()

return 'Meow!';
>
>

$cat = new Cat();
$cat->greet(); // Meow!
$cat->hasFur(); // true

Выводы об абстрактных классах:

  • Не могут быть созданы сами по себе
  • Абстрактные методы просто объявляют сигнатуру (без функциональности)
  • Используются дочерними классами с расширениями
  • Действует как своего рода частично построенный класс

Трейт

Трейты — способ повторного использования кода в нескольких (иногда совершенно несвязанных между собой) классах. В отличие от абстрактных классов, в одном классе можно использовать несколько трейтов с помощью оператора use .

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

Например, у нас может быть два трейта HasLegs и HasFins :

 
trait HasLegs

public function walk()

$steps = 0;
while (true)
$steps++;
>
>
>
 
trait HasFins

public function swim()

$laps = 0;
while (true)
$laps++;
>
>
>

Мы продолжаем работать с животными из предыдущих примеров, так что давайте представим, что у нас есть объект Cat , у которого явно есть ноги и он может ходить. Мы можем использовать трейт HasLegs , чтобы дать нашему классу Cat метод walk() , который можно использовать:

 
class Cat

use HasLegs;
>

$cat = new Cat();
$cat->walk();

Или, что у нас есть объект Duck , у которого есть ноги и плавники? Мы можем использовать оба трейта и дать нашему классу методы walk() и swim() :

 
class Duck

use HasLegs, HasFins;
>

$duck = new Duck();
$duck->walk();
//или
$duck->swim();
  • Идеально подходит для повторного использования кода
  • Реализуется в теле класса с use
  • В одном классе можно использовать несколько
  • Может иметь как свойства так и методы

Интерфейс

Интерфейсы — способ принудительного применения определённых реализаций в классах, которые их используют. Интерфейсы могут содержать только сигнатуры методов, в них вообще нет никакой функциональности. В основном они предназначены для обеспечения структуры и служат чертежами для построения классов.

Возьмём этот пример интерфейса:

 
interface Bug

public function legs();
public function eyes();
>

Опять, никакой реализации методов legs() и eyes() , только сигнатура, которую они требуют в классах включающих этот интерфейс. Итак, если мы создаём классы, реализующие наш интерфейс Bug , эти метода должны быть доступны в каждом из них.

 
class Spider implements Bug

public function legs()

return 8;
>

public function eyes()

return 8;
>
>
 
class Beetle implements Bug

public function legs()

return 6;
>

public function eyes()

return 2;
>
>

Итак, теперь у нас есть два класса, каждый из которых реализует интерфейс Bug , каждый из них должен включать методы legs() и eyes() , а также собственную (обычно уникальную) реализацию.

  • Действуют как чертежи для классов
  • Используются в объявлении класса с реализациями
  • Можно использовать несколько интерфейсов в одном классе
  • Содержит только сигнатуры методов (без свойств)

Надеюсь теперь вы лучше понимаете различия и сходства между абстрактными классами, трейтами и интерфейсами. Каждый из них мощный и при различных сочетаниях может добавить много мощности и структуры вашим PHP-приложениям.

Важно убедится, что ваш код легко читается, поддерживается, расширяется и тестируется. Один из способов улучшить эти факторы — использовать интерфейсы.

Я решил написать статью, объясняющую различия между абстрактными классами и интерфейсами в PHP и дать краткий обзор, когда нужно использовать каждый из них.

Источник

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

Сравнение абстрактного класса и интерфейса в PHP. В чем разница между абстрактным классом и интерфейсом в PHP? Это один из самых распространненых вопросов на собеседованиях.

В этом уроке вы узнаете некоторые важные различия между абстрактным классом и интерфейсом.

Интерфейс в PHP

Интерфейс — это соглашение, контракт или договор. Когда класс реализует интерфейс, это означает, что он содержит публичные методы интерфейса и их реализации.

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

// Defined cacheInterface interface cacheInterface < public function get($key); public function set($key,$value); >/* * A Memcache class implements cacheInterface */ class Memcache implements cacheInterface < public function get($key)< // method body >public function set($key,$value) < // method body >>

В приведенном выше примере создается cacheInterface , содержащий публичные методы get() и set() . Любой класс, который реализует этот интерфейс, должен определить методы get() и set() .

В этом примере класс Memcache реализует cacheInterface . Это означает, что он придерживается контракта и определяет тело методов get() и set() . Аналогично, если какой-либо другой класс кэширования реализует этот интерфейс, он определит методы get() и set() .

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

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

Экземпляры абстрактных классов не могут быть созданы напрямую.

abstract class car < abstract public function modelType(); public function wheelCount() < echo "I have four wheels"; >> class HondaCity extends car < public function modelType()< echo "HondaCity"; >> $data = new HondaCity; $data->modelType(); $data->wheelCount();

Сравнение абстрактного класса и интерфейса в PHP

Интерфейс Абстрактный класс
Поддерживаем множественное наследование Не поддерживаем множественное наследование
Не содержит data members Может содержать data members
Не содержит конструктор Может содержать конструктор
Содержит только объявление методов (сигнатуры методов) Может содержать как сигнатуры методов так и их реализации
Не может иметь модификаторов доступа — все методы по умолчанию публичные Может иметь модификаторы доступа
Методы не могут быть статическими Только методы, содержащие реализацию, могут быть объявлены статическими

1. Абстрактный класс действует как образец для классов, которые его наследуют. Дочерний класс, который наследует абстрактный класс, должен реализовывать методы, объявленые абстрактными в родительском классе. Абстрактный класс создается только для как элемент иерархии наследования. Это означает, что вы не можете создать объект абстрактного класса.

Интерфейс — это контракт. Он содержит только сигнатуры методов (без тела метода). Класс, который реализует интерфейс, должен реализовывать эти методы.

2. Класс может расширять только один абстрактный класс, тогда как класс может реализовывать несколько интерфейсов.

interface A <> interface B <> interface C <> //A class can implements multiple interfaces class Base implements A, B, C <>

3. В абстрактном классе мы можем определить переменные экземпляра и конкретные (неабстрактные) методы.

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

4. Абстрактный класс хорош, когда есть некоторые общие черты, которые должны быть общими для всех объектов.

Используйте интерфейс, когда все функции должны быть реализованы по-разному для разных объектов. Все методы cacheInterface будут реализованы по-разному для всех классов.

Например — класс Memcache определяет тело метода get() и set() , но их реализация будет отличается от класса Redis.

Источник

PHP. ООП. Абстрактные классы и интерфейсы

В сегодняшнем уроке мы рассмотрим абстрактные классы и интерфейсы в php, а также обсудим различия между ними.

Абстрактные классы в php реализуются добавлением ключевого слово abstract. Абстрактные классы могут иметь свойства и методы. Но в отличии от обычных классов, методы в абстрактных классах не имеют тела. Ключевое значение в таких методах — необходимость их реализации в дочерних классах.

Интерфейс — это тот же абстрактный класс, но у него нет свойств. Интерфейс объявляется при помощи ключевого слова interface.

Еще одной важной особенностью является то, что класс может унаследовать только один класс, но может реализовывать сколь угодно много интерфейсов.

Различие в применении абстрактного класса и интерфейса — очень тонкий вопрос. Абстрактный класс скорее служит для объединения семейства классов. Например, есть абстрактный класс Автомобиль, и от него наследуются классы Ford, Toyota, у которых есть общие методы (объявленные в абстрактном классе).
Но если появляется класс Велосипед, то в нем нет смысла реализовывать, например, метод ПоменятьМасло. Для таких классов лучше описывать интерфейсы.

Код урока (абстрактный класс)

> class Car extends Transport < public $wheels = 4; public function countWheels() < echo "У машины " . $this->wheels . » колеса»; > public function driverSide() < echo $this->driverName . » сидит за рулем слева»; > public function changeOil() < echo "В машине надо обязательно менять масло"; >> class Bike extends Transport < public $wheels = 2; public function countWheels() < echo "У велосипеда " . $this->wheels . » колеса»; > public function driverSide() < echo $this->driverName . » просто сидит за рулем»; > public function changeOil() < echo "В велосипеде надо обязательно менять масло. Да ладно?"; >> $car = new Car(); $bike = new Bike(); /*Посмотрим на объекты*/ echo «

"; print_r($car); echo "

«; echo «

"; print_r($bike); echo "

«; $car->countWheels(); echo «
«; $bike->countWheels(); echo «
«; $car->driverSide(); echo «
«; $bike->driverSide(); echo «
«; $car->changeOil(); echo «
«; $bike->changeOil(); echo «
«; $car->sayHello(); echo «
«; $bike->sayHello();

Код урока (интерфейс)

interface Doorable < public function countDoors(); >class Car implements Oilable, Doorable < public $wheels = 4; public function countWheels() < echo "У машины " . $this->wheels . » колеса»; > public function changeOil() < echo "Пора менять масло"; >public function countDoors() < echo "В машине 2 или 4 двери"; >> class Bike < public $wheels = 2; public function countWheels() < echo "У велосипеда " . $this->wheels . » колеса»; > > $car = new Car(); $bike = new Bike(); /*Посмотрим на объекты*/ echo «

"; print_r($car); echo "

«; echo «

"; print_r($bike); echo "

«; $car->countWheels(); echo «
«; $bike->countWheels(); echo «
«; $car->changeOil(); echo «
«; $car->countDoors();

Источник

Оцените статью