Другие решения
Полиморфизм — это процесс определения более одного тела для функций / методов с одинаковым именем.
Перегрузка — это тип полиморфизма, где часть подписи должна быть другой. Переопределение является еще одним, который используется в случае наследования, где часть подписи также является той же.
Нет, это неправда, что полиморфизм происходит во время выполнения. То, что происходит во время выполнения, называется полиморфизмом времени выполнения. Это реализовано с помощью Ключевое слово в C ++.
Надеюсь, это помогло ..
Полиморфизм является основой ООП, перегрузка является одним из способов реализации полиморфизма, особенно когда задействованы операторы. В более общем смысле, говоря о полиморфизме, когда участвуют два или более классов. Хотя перегрузка может производиться и внутри одного и того же класса, мы можем перегрузить имя метода несколькими сигнатурами (другой список параметров). При этом переопределение предназначено исключительно для вовлечения двух или более классов
Обратите внимание, что переопределенные методы имеют одинаковую подпись
Само слово объясняет ясный смысл. «Поли» означает множественное число, а «морфизм» (используемый в технологии изображений) означает процесс постепенного перехода от одной формы к другой. Таким образом, одна и та же вещь будет иметь разные формы.
Технически, полиморфизм — это способ реализации «множественной реализации единого интерфейса (каркас или структура) (контент или тело)». Полиморфизм — это общий термин, который относится как к перегрузке, так и к переопределению. Перегрузка выполняется в том же классе, где функции или методы с одинаковыми именами имеют разные сигнатуры (список аргументов или тип возвращаемого значения), а переопределение появляется на рисунке в случае наследования, когда интерфейс функции в классе Super имеет аналогичный интерфейс в подклассе. и имеет другую реализацию, чем та, что в суперклассе.
Суперкласс и подкласс образуют иерархию, переходящую от меньшей специализации к большей специализации, и об этом всегда следует помнить при реализации переопределения функций.
Полиморфизм основан на следующих 2 концепциях:
- Перегрузки (компилировать-Временной полиморфизм): методы с тем же именем, но с другой операцией
- Переопределение (Run-Time полиморфизм): переопределить метод в базовом классе, создав аналогичный метод в производном классе
-Исправил объяснения
Шьям Кодасе
Перегрузка — это просто способ обеспечить несколько способов вызова одного и того же метода / функции / конструктора со значениями по умолчанию, с меньшим количеством аргументов и т. Д.
Полиморфизм — это наследование объектов, подклассов и т. Д.
-1
Перегрузка свойств
Перегрузка свойств PHP позволяет нам создавать у объекта динамические свойства. Свойство, связанное с экземпляром класса и не объявленное внутри класса, считается перегруженным свойством.
Мы можем выполнять следующие операции с перегруженными свойствами в PHP.
- Установка и получение перегруженных свойств.
- Оценка настройки перегруженных свойств.
- Отмена настройки таких свойств.
Перед выполнением трех вышеуказанных операций мы должны определить соответствующие магические методы:
- __set() — срабатывает при инициализации перегруженных свойств.
- __get() — срабатывает при использовании перегруженных свойств.
- __isset() — этот магический метод вызывается, когда мы проверяем перегруженные свойства с помощью функции isset()
- __unset() — аналогично, эта функция будет вызываться при использовании PHP unset() для перегруженных свойств.
Еще проще понять срабатывание этих методов в тот момент, когда свойства, к которым они будут применимы будут недоступны. Т.е. если мы попытаемся присвоить значение недоступному свойству, то как раз сработает __set(), либо наоборот попытка чтение недоступного свойства приведет к срабатыванию __get(). Надеюсь так будет понятнее.
Итак посмотрим на пример, который предназначен для динамического создания элементов массива свойств:
В приведенном выше примере создается динамическое свойство overloaded_property. При инициализации этого динамического свойства вызывается __set() с парой имя и значение, которая инициализируется как имя и значение элемента массива свойств класса $data.
Вдобавок к этому isset() и unset() с перегруженным свойством будут запускать магические методы __isset() и __unset(). Тут все достаточно просто, перейдем к другой перегрузке.
Перегрузка и перезапись
Сначала различите перегрузку и переопределение: перегрузка относится к нескольким именам с одинаковым именем, ноРазличные параметрыФункция вТот же объемФеномен сосуществования; переписывание происходит при наследовании и относится к феномену переопределения подклассом функции родительского класса, также известного как покрытие. В перегрузке есть три случая различных параметров: другое количество параметров, другой тип параметра и другой порядок параметров. Переписывание обычно относится к охвату функций, то есть переопределению функций-членов одной и той же сигнатуры в подклассах (реализация абстрактных функций или интерфейсов не является переписыванием), что является ключевой технологией для достижения полиморфизма. Переменные-члены также могут быть перегружены / перезаписаны, но обычно этого не происходит.
Используйте простой код C, чтобы проиллюстрировать перегрузку:
Первая функция является эталонным тестом, а остальные три соответствуют трем ситуациям перегрузки. Перегрузка функций чаще встречается в языках со строгой типизацией.После компиляции имя функции в таблице символов функций обычно представляет собой имя функции плюс тип параметра. После того, как указанные выше четыре функции скомпилированы g ++, команда nm просматривает имена в таблице символов и выводит следующий результат:
Третий столбец в последних четырех строках соответствует символьной информации четырех функций после компиляции, _Z3 — это префикс, add — имя функции, оставшаяся буква d означает double, а i означает int, что соответствует последовательной жизни.
Вернемся к перегрузке PHP. Нет необходимости объявлять тип параметров в объявлении функции PHP. Две перегрузки с разными типами параметров и разными порядками параметров исключаются напрямую. Есть только один способ указать количество параметров. Определение функции с тем же количеством параметров и тем же именем, такое требование небольшой перегрузки, также недопустимо в PHP! Причина в том, что функции с тем же именем не разрешены в PHP. Если вы хотите определить функции с тем же именем, откажитесь! Хотя в большинстве случаев реализации перегрузки с параметрами по умолчанию в основном достаточно, но время от времени я чувствую себя обиженным и не могу не спросить: почему PHP не позволяет (одноименной функции) быть перегруженным? !
Проблемы PHP
PHP по какой-то причине не поддерживает перегрузку одноименных функций. Как упоминалось выше, при объявлении функции PHP нет необходимости указывать тип параметра.Три случая перегрузки немедленно отменяются. Количество сохранившихся параметров разное, и эта дорога не работает, почему? Потому что при вызове функции в PHP передайте меньше параметров, нет проблем; передайте больше параметров, нет проблем! Вот простой пример:
Пока это число не меньше заявленного, независимо от того, сколько параметров передается в PHP. Поэтому количество параметров разное, чего недостаточно для различения функций в PHP.
Я лично считаю, что еще одна важная причина, по которой не разрешается существование функций имен, — это、 、Существование этих API. Как простой и легкий в использовании язык, PHP предоставляет разработчикам удобный API для запроса наличия / доступности имен функций, что редко встречается в языках программирования (особенноТакой API). Как видите, ни один из этих API не требует информации о параметрах. Если вы можете определить перегруженные функции с другими параметрами, эти API-интерфейсы придется изменить, что неизбежно приведет к дополнительной сложности. Как говорится, нельзя иметь и рыбные, и медвежьи лапы. Когда вам удобно пользоваться, вы не ожидали, что параметры будут другими.
PHP5 представил API отражения, который является очень мощным инструментом запроса информации о типах. Что касается объявления функции, такие API, как getParameters / getNumberOfParameters / getNumberOfRequiredParameters класса ReflectionMethod / ReflectionFunction, функционально отклоняются.Подождите несколько улиц. С механизмом отражения логичноЭти API-интерфейсы можно спокойно прекратить. Хотя набор отражений мощный, он далеко не прост и удобен в использовании, чем старый API. Кроме того, посмотрите на код на рынке, сколько библиотек и фреймворков полагаются на старый API. Из соображений совместимости и практичности лично мне кажется, что вероятность перегрузки одноименной функции за короткое время очень мала.
Перегрузка в PHP
Концепция перегрузки требует магических методов, суть метода заключается в создании динамических сущностей. Свойства и методы — это именно те сущности, которые и будут создаваться динамически с помощью перегрузки PHP. После создания объекта мы можем получить доступ к набору сущностей, то есть свойствам или методам, не определенных в рамках класса.
Магические методы начинаются с __ (двойное подчеркивание) и автоматически вызываются PHP. Кроме того, они всегда определяются внутри, а не вне класса. Различные магические методы: __get(), __set(), __ construct(), __destruct(), __call(), __callStatic(), __isset(), __unset(). Большинство магических методов будут запускаться в контексте объекта, за исключением метода __callStatic(), который используется в статическом контексте.
Перегрузка методов или функций
Если вы хотите реализовать перегрузку метода или функции в PHP, вы можете добиться этого с помощью магического метода __call() или __callStatic(). В отличие от перегрузки свойств, перегрузка метода PHP позволяет вызывать функцию как в объектном, так и в статическом контексте.
Для начала возьмем пример попроще и с явным поведением:
Как видно из примера доступ к некоторому перегруженному методу с именем класса вызовет статический магический член, определенный внутри класса.
Теперь попробуем реализовать что-нибудь посложнее:
Как видите, при вызове метода объекта overloaded_method() класса MyClass он запускает магический метод __call, поскольку вызываемый метод overloaded_method() не существует.
И далее здесь начинается магия. Как вы понимаете, у нас есть два разных метода, вызываемых overloaded_method1() и overloaded_method2() для обработки одного аргумента и двух аргументов соответственно.
Метод __call вызывает эти методы, используя функцию call_user_func_array, основанную на количестве аргументов при вызове метода overloaded_method. И вот так вы можете добиться более сложной перегрузки методов/функций в PHP.
Конечно, использовать это несколько сложно. Поскольку вам придется вручную проверять некоторые вещи и следить за тем, чтобы что-то не сломалось.
Однако, используя данный принцип и, возможно, опираясь на другие варианты использования, возможна такая форма перегрузки, при условии, что у вас есть некоторые строгие соглашения об именах в ваших функциях для их точного вызова. Как у нас в нашем примере, overloaded_method1 и overloaded_method2.
Конструктор класса в PHP.
Конструктор объявляется как метод класса с именем __construct(). Он может содержать произвольное число параметров, и предназначен, прежде всего, для инициализации свойств создаваемого экземпляра объекта.
Пример функции-конструктора.
class MyClass {
public function __construct($name) {
$this->name = $name;
}
…
}
1 |
classMyClass{ publicfunction__construct($name){ $this->name=$name; } … } |
Иногда классу требуется объявить несколько разных конструкторов. Здесь можно применять разные подходы, весь перечень их ограничен лишь вашей фантазией. Я покажу вам несколько вариантов.