Всем привет! Помогите понять полиморфизм правильно. Так как примеров в Интернете много и все они отличаются друг от друга.
Как я его понимаю. Это когда свойство базового класса может использовать методы производных классов.
Часто встречаю в Интернет два примера полиморфизма
Пример 1.
class user {
public $type = 'default_user';
public function setName (){
}
public function Call (){
return $this->setName();
}
}
class admin extends user {
public function setName (){
return $this->type = "admin";
}
}
class superUsers extends user {
public function setName (){
return $this->type = "superUser";
}
}
$super = new superUsers;
$admin = new admin;
echo $super->call();
echo $admin->call();
Пример 2.
class user {
public $type = 'default_user';
public function setName (){
}
}
class admin extends user {
public function setName (){
return $this->type = "admin";
}
}
class superUsers extends user {
public function setName (){
return $this->type = "superUser";
}
}
$super = new superUsers;
$admin = new admin;
echo $super->setName();
echo $admin->setName();
Так как я понял и в первом примере и во втором примере показан полиморфизм , а называется этот вид override.
Стоит начать с того, что полиморфизм бывает разный.
В ООП полиморфизмом чаще всего называют способность классов с одинаковой спецификацией(интерфейсом) определять различную реализацию, что, в свою очередь, позволяет клиентскому коду абстрагироваться от этой самой реализации и работать с классом, исходя из его спецификации.
Например, ваш метод может ожидать получить на входе объект типа UserInterface
, при этом не зная, с каким конкретным подтипом типа UserInterface
он будет работать. Таким образом вы можете единообразно обрабатывать различные типы данных, полагаясь на то, что каждый входной параметр соответствует спецификации UserInterface
.
При этом, в некоторых ООП языках используется т.н. "утиная типизация". Она же неявная типизация. Это когда клиентский код ожидает, что у используемого им объекта определен некоторый метод. Это позволяет использовать полиморфизм для обработки объектов, которые даже не обязательно входят в иерархию наследования.
Например, если я напишу функцию:
function ($object) {
echo $object->setName();
}
Она сможет корректно работать как с вашими наследниками от user
, так и с любым другим объектом, у которого можно вызвать метод setName
без параметров, который возвращал бы строку.
Например:
class DefinitelyNotAUser {
public function setName()
{
return 'haduken!';
}
}
Анонимная функция описаная выше сможет работать с экземплярами этого класса точно так же как и с вашими наследниками от user
.
Это называется сигнатурным полиморфизмом. Такой подход широко распространен в Ruby, в PHP я бы не рекоммендовал его использовать.
Функция реализованная для произвольного типа данных также будет примером полиморфизма (параметрического). Например:
function handler($object, callable $action)
{
return $action($object);
}
$result = handler(new admin(), function ($object) { echo $object->setName(); });
Стоит заметить, что полиморфизм не яляется чем-то свойственным исключительно объектно-ориентированной парадигме. Полиморфизм присутствует и в функциональной, и в процедурной парадигме. Параметрический полиморфизм функции описаной для произвольного типа данных - пример для ФП. Вызов конкретной реализации функции в зависимости от типов переданных параметров - пример полиморфизма для процедурного программирования.
Главное проявление полиморфизма - позднее связывание вызываемого кода с вызывающим, когда среда запуска умеет определять, какая именно вызывается реализация, исходя из контекста исполнения программы.
Самое простое определение полиморфизма, которое вам сейчас необходимо запомнить, учитывая, что в тэгах к вопросу стоят PHP и ООП: "Один интерфейс - много реализаций".
Что неправильно в вашем текущем понимании: вы зацикленны на отношениях базового и производных классов. Полиморфизм не об этом. Он о вызывающем (клиентском) коде и вызываемом, а также об их динамическом соответствии.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Есть скрипт который загружает картинки в на сервер и путь в бд прописываетПодскажите пожалуйста как сделать так, чтобы каждое загружаемое...
Требуется извлечь из всех узлов JSON-строки значения с идентификатором "text" с целью собрать на выходе выражение (предложение)
Есть такой код, который не работаетКласс работает правильно, проблема только в функции header();