Черты в PHP

Существует ли множественное наследование в PHP? Трейты – это механизм, введенный в язык PHP для устранения ограничений одиночного наследования и создания эффекта множественного наследования.

Согласно документации PHP, Traits — это механизм повторного использования кода в языках с одинарным наследованием, таких как PHP. Преднамеренно, трейты введены в язык PHP, чтобы устранить ограничение одиночного наследования и дать представление о множественном наследовании. В отличие от других языков ООП, PHP не поддерживает концепцию множественного наследования. Чтобы быть точным, в PHP дочерний класс не может быть производным более чем от одного родительского класса. Следовательно, Traits — это стратегия, которая играет важную роль в PHP, чтобы избавиться от ситуации. По сути, черта может быть определена с помощью ключевого слова trait и может быть вставлена ​​в класс с помощью ключевого слова use. Тем не менее, Черты не могут быть реализованы сами по себе в течение их жизни. И последнее, но не менее важное: Traits могут определять как свойства, так и методы, но они не могут определять константы.

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

Между прочим, я написал плодотворную статью об интерфейсах, трейтах и ​​абстрактных классах, в которой трейты сочетаются с другими объектно-ориентированными функциями PHP. На статью можно перейти по этой Ссылке. Кроме того, документацию PHP по Traits также можно найти по этой Ссылке.

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

  • traits.php
  • traits_static-version.php

По сути, структура черты очень похожа на структуру класса. В приведенных ниже примерах мы определили FlightServices и FlightInfo как Traits, которые содержат как неабстрактные, так и абстрактные методы. Теперь кто-нибудь из аудитории может задать вопрос: что такое абстрактный метод? Метод, который не получает никакой реализации, точнее, метод, который не содержит тела, известен как абстрактный метод. Кроме того, эти абстрактные методы должны быть реализованы расширяющими Traits и классами. Как видно из следующих примеров, абстрактные методы sit() и food() были реализованы классами Economic и Business.

Что важно упомянуть в примерах о трейтах, так это то, что трейты FlightServices и FlightInfo содержат разные методы для выполнения бронирования рейсов для экономического и бизнес-класса. Если бы FlightServices и FlightInfo были классами, а не Traits, ни экономический, ни бизнес-класс не смогли бы расширять оба («классы») одновременно, поскольку PHP не поддерживает множественное наследование, в отличие от некоторых других языков ООП. Удивительно, но PHP позволяет классу хранить более одного Trait одновременно, что несколько уменьшает отсутствие множественного наследования.

В следующем коде, благодаря поддержке объекта FlightBooking, сначала мы можем создать объект, либо экономический, либо бизнес, а затем мы можем подтвердить бронирование рейса, выполнив метод confirmFlight(). В целом тикет делается с помощью метода ticket().

//........
class FlightBooking
{    
	//.....
	
	protected function ticket($c)
	{
		//..........
	}

	public function confirmFlight($category)
	{	
		$category = new $category;
		$this->ticket($category);
	}    
}

$f = new FlightBooking();
//.......
$f->confirmFlight($class);
// where $class is either 'Economic' or 'Business'

Теперь можно мечтать лететь к месту назначения в зависимости от стоимости перелета, не так ли?

Полный код для примера trait.php приведен ниже:

Полностью статическая версия примера, которая является немного утонченной версией первого примера, приведена ниже:

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

Мы будем очень признательны за любые ваши ценные комментарии и предложения по поводу статьи, кроме ваших аплодисментов.

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

Спасибо!