Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Наследование классов в PHP, примеры, цепочка вызовов методов кратко

Лекция



Привет, сегодня поговорим про наследование классов в php ы цепочка вызовов методов, обещаю рассказать все что знаю. Для того чтобы лучше понимать что такое наследование классов в php ы цепочка вызовов методов , настоятельно рекомендую прочитать все из категории Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend) .

Объектно-ориентированное программирование - это стиль кодирования, который позволяет разработчику группировать схожие задачи в классы
ООП основано на:

  • Инкапсуляции
  • Полиморфизме
  • Наследовании

Рассмотрим Наследовании подробнее

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

Наследование - это специальный механизм языка, позволяющий описать новый класс на основе уже существующего (родительского, базового) класса. Потомок(дочерний класс) может добавить (или переопределять) собственные методы и свойства, а также пользоваться родительскими методами и свойствами.
Наследование - это не просто создание точной копии класса, а расширение уже существующего класса, чтобы потомок мог выполнять какие-нибудь новые, характерные только ему функции.
Схематичное изображение наследования классом B класса А с помощю диаграмы Венна (или Диаграммы Эйлера)

Наследование классов в PHP, примеры,  цепочка вызовов методов

С помощью UML диаграммы наследование схематично можно показать так (смоделировать)

Наследование классов в PHP, примеры,  цепочка вызовов методов

Итак, пусть у нас есть некоторый класс A с определенными свойствами и методами. Но то, что этот класс делает, нас не совсем устраивает — например, пусть он выполняет большинство функций, по сути нам необходимых, но не реализует некоторых других. Зададимся целью создать новый класс B, как бы "расширяющий" возможности класса A, добавляющий ему несколько новых свойств и методов. Сделать это можно двумя принципиально различными способами. Первый выглядит примерно так:

class A {
  function TestA() { ... }
  function Test() { ... }
}

class B {
  public $a; // объект класса A
  function B(параметры_для_A, другие_параметры){ 
    $a = new A(параметры_для_A);
    // инициализируем другие поля B
  }
  function TestB() { ... }
  function Test() { ... }
}

Поясним: в этой реализации объект класса B содержит в своем составе подобъект класса A в качестве свойства. Это свойство — лишь "частичка" объекта класса B, не более того. Подобъект не "знает", что он в действительности не самостоятелен, а содержится в классе B, поэтому не может предпринимать никаких действий, специфичных для этого класса.
Мы хотели получить расширение возможностей класса A, а не нечто, содержащее объекты A. Об этом говорит сайт https://intellect.icu . Что означает "расширение"? Лишь одно: мы бы хотели, чтобы везде, где допустима работа с объектами класса A, была допустима и работа с объектами класса B. Но в приведенном примере это совсем не так.

Итак, мы имеем некоторые проблемы:

1. Мы не видим явно, что класс B лишь расширяет возможности A, а не является отдельной сущностью;
2. Мы должны обращаться к "части A" класса B через $obj->a->TestA(), а к членам самого класса B как $obj->TestB(). Последнее может быть довольно утомительным, если, как это часто бывает, в B будет использоваться очень много методов из A и гораздо меньше — из B. Кроме того, это заставляет нас постоянно помнить о внутреннем устройстве класса B.

Теперь на практике рассмотрим, что же представляет собой наследование (или расширение возможностей) классов:

class B extends A {
  function B(параметры_для_A, другие_параметры) { 
    $this->A(параметры_для_A);
    // инициализируем другие поля B
  }

  function TestB() { ... }
  function Test() { ... }
}

Ключевое слово extends говорит о том, что создаваемый класс является лишь "расширением" класса A, и не более того. То есть B содержит те же самые свойства и методы, что и A, но, помимо них и еще некоторые дополнительные, "свои".
Теперь "часть A" находится прямо внутри класса B и может быть легко доступна, наравне с методами и свойствами самого класса B. Например, для объекта $obj класса B допустимы выражения

$obj->TestA() и $obj->TestB().

Итак, мы видим, что, действительно, класс B является воплощением идеи "расширение функциональности
класса A". Обратите также внимание: мы можем теперь забыть, что B унаследовал от A некоторые свойства или методы — снаружи все выглядит так, будто класс B реализует их самостоятельно.

Начиная с версии 5 в PHP появилась новая фича - «цепочки вызовов» (Method Chaining) и выглядит следующим образом:

$object->method_a()->method_b()->method_c();

Работа их основана на том что методы могут возвращать объекты. Причем этот объект — может быть как текущего класса, так и роительского

Обычное использование класса
Начнем с самого обыкновенного класса и его использования.

class Person
{
private $m_szName;
private $m_iAge;
public function setName($szName)
{
$this->m_szName = $szName;
}
public function setAge($iAge)
{
$this->m_iAge = $iAge;
}
public function introduce()
{
printf('Привет меня звали в школе %s и тогда мне было всего %d лет.',$this->m_szName,$this->m_iAge);
}

}

Теперь мы можем создать инстанс класса Person и передать в объект имя и возраст.

После чего, воспользовавшись методом introduce вывести на экран информацию о школьнике:

$peter = new Person();
$peter->setName('Катя');
$peter->setAge(12);
$peter->introduce();

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

  1. Привет меня звали в школе Катя и тогда мне было всего 12 лет. 

Использование цепочных вызовов
Добавим всего пару строки. Нам нужно возвращать объект класса Person из каждого метода. Наш исходный класс будет выглядеть так:

class Person
{
private $m_szName;
private $m_iAge;
public function setName($szName)
{
$this->m_szName = $szName;
return $this; //Возвращаем объект текущего класса
}

public function setAge($iAge)
{
$this->m_iAge = $iAge;
return $this; //Возвращаем объект текущего класса
}

public function introduce()
{
printf( 'Привет меня звали в школе %s и тогда мне было всего %d лет.',
$this->m_szName,
$this->m_iAge);
}

}

Пример использования модифицированного класса:

$peter = new Person();
$peter->setName('Peter')->setAge(23)->introduce();

при этом будет выведено абсолютно тоже самое, что и в изначальном примере.

Немного о терминологии: родительский класс A принято называть базовым классом, а класс дочерний класс B —производным от A. Иногда базовый класс также называют суперклассом, а производный — подкласcом.

Рассмотрим еще один пример на PHP:

class Parent {
  function parent_funct() { echo "Это родительская функция"; }
  function test () { echo "Это родительский класс

"; }
}

class Child extends Parent {
  function child_funct() { echo "Это дочерняя функция"; }
  function test () { echo "Это дочерний класс"; }
}

$object = new Parent;
$object = new Child;

$object->parent_funct(); // Выводит 'Это родительская функция'
$object->child_funct(); // Выводит 'Это дочерняя функция'
$object->test(); // Выводит 'Это дочерний класс'
?>

Дочерний класс (подкласс) Child наследует все методы и свойства суперкласса Parent.

Надеюсь, эта статья про наследование классов в php ы цепочка вызовов методов, была вам полезна, счастья и удачи в ваших начинаниях! Надеюсь, что теперь ты понял что такое наследование классов в php ы цепочка вызовов методов и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)

Из статьи мы узнали кратко, но содержательно про наследование классов в php ы цепочка вызовов методов
создано: 2015-02-25
обновлено: 2021-03-13
132498



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей



Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)

Термины: Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)