0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>В курсе "PHP: Полиморфизм" мы разбирали как работает полиморфизм изнутри. Но тогда мы ещё не знали про наследование достаточно, чтобы раскрыть этот вопрос полностью. Сейчас пришло время узнать об этом.</p>
1
<p>В курсе "PHP: Полиморфизм" мы разбирали как работает полиморфизм изнутри. Но тогда мы ещё не знали про наследование достаточно, чтобы раскрыть этот вопрос полностью. Сейчас пришло время узнать об этом.</p>
2
<p>Перед тем как начать, нужно вспомнить, что для полиморфизма наследование не нужно. С другой стороны, наследование участвует в процессе выбора метода и об этом тоже нужно знать. Посмотрите на код, который был в курсе, посвящённому полиморфизму:</p>
2
<p>Перед тем как начать, нужно вспомнить, что для полиморфизма наследование не нужно. С другой стороны, наследование участвует в процессе выбора метода и об этом тоже нужно знать. Посмотрите на код, который был в курсе, посвящённому полиморфизму:</p>
3
<p>В этом коде проверка останавливается, если ничего не было найдено. Так было бы без наследования, но с наследованием поиск продолжается. Сначала выбирается базовый класс для текущего и метод ищется там. Если он не найден, то снова проверяется наличие __call(). Затем процесс повторяется для родительского класса родителя текущего класса и далее до конца цепочки наследования.</p>
3
<p>В этом коде проверка останавливается, если ничего не было найдено. Так было бы без наследования, но с наследованием поиск продолжается. Сначала выбирается базовый класс для текущего и метод ищется там. Если он не найден, то снова проверяется наличие __call(). Затем процесс повторяется для родительского класса родителя текущего класса и далее до конца цепочки наследования.</p>
4
<p>Из этого, кстати, следует интересный вывод. Метод __call это "тяжелый" вызов. Он требует больше вычислений для поиска. И чем ближе к началу иерархии расположен __call() тем хуже с точки зрения производительности.</p>
4
<p>Из этого, кстати, следует интересный вывод. Метод __call это "тяжелый" вызов. Он требует больше вычислений для поиска. И чем ближе к началу иерархии расположен __call() тем хуже с точки зрения производительности.</p>
5
<h2>Позднее связывание в сравнении с динамической диспетчеризацией</h2>
5
<h2>Позднее связывание в сравнении с динамической диспетчеризацией</h2>
6
<p>Программисты часто путают позднее связывание и динамическую диспетчеризацию. Ситуация усугубляется тем, что в некоторых языках (например, Java) принято на уровне документации и сообщества подменять одно понятие другим.</p>
6
<p>Программисты часто путают позднее связывание и динамическую диспетчеризацию. Ситуация усугубляется тем, что в некоторых языках (например, Java) принято на уровне документации и сообщества подменять одно понятие другим.</p>
7
<p>Связывание говорит нам о том, чем является идентификатор, какой у него тип. Если связывание раннее, то мы это знаем сразу, в случае позднего, только в момент вызова кода. Во многих языках можно определить функцию после того, как где-то она используется. Это тоже пример связывания (позднего). В случае $this в PHP, мы знаем что это объект текущей иерархии, но не знаем точно какой класс до момента срабатывания этого кода.</p>
7
<p>Связывание говорит нам о том, чем является идентификатор, какой у него тип. Если связывание раннее, то мы это знаем сразу, в случае позднего, только в момент вызова кода. Во многих языках можно определить функцию после того, как где-то она используется. Это тоже пример связывания (позднего). В случае $this в PHP, мы знаем что это объект текущей иерархии, но не знаем точно какой класс до момента срабатывания этого кода.</p>
8
<p>Диспетчеризация же, это процесс поиска и вызова необходимой функции (или метода, в зависимости от языка) для уже известного типа данных.</p>
8
<p>Диспетчеризация же, это процесс поиска и вызова необходимой функции (или метода, в зависимости от языка) для уже известного типа данных.</p>