ООП для начинающих PHP. Инкапсуляция и полиморфизм.Просто о сложном

ООП для начинающих PHP. Инкапсуляция и полиморфизм.Просто о сложном

Web Developer Blog

7 лет назад

37,509 Просмотров

Ссылки и html тэги не поддерживаются


Комментарии:

Mobile game 1146
Mobile game 1146 - 17.05.2022 13:53

спасибо за урок!!!!!

Ответить
Roman Tymoshyk
Roman Tymoshyk - 01.11.2021 22:06

На самом деле автор описывает наследование вместо полиморфизма.

Ответить
Данил
Данил - 21.03.2021 01:51

Если кто не понял поповоду полиморфизма, вот я кратции вам расскажу:
Это по сути переопределение методов и свойств класса который наследуешь и само собой переопределение логики этих методов или свойств

Ответить
Андрей Ставицкий
Андрей Ставицкий - 02.06.2020 16:38

"Дизлайк и отписка". Ну шутка, конечно, но вот прям видео совсем мимо. Если говорить, что инкапсуляция - это всего лишь сокрытие, такой ответ трактуется как неправильный, судя по многочисленным отзывам. И можно на этом вопросе сразу провалить собеседование. Инкапсуляция включает в себя, не ограничивается сокрытием.
Плюс пример неудачный. Кнопка это пример именно инкапсуляции, при чем тут полиморфизм? Вот если при нажатии на одну и ту же кнопку разными людьми происходят разные действия - это был бы полиморфизм. Ну например кнопка со сканером отпечатков пальца - если на нее нажимает хозяин, то открывается дверь, а если чужой - то звенит дверной звонок.
А вот просто кнопка - это инкапсуляция. Она в себе скрывает некий механизм работы, который для нажимающего не важен - это и есть инкапсуляция. И в том числе сокрытие логики работы, ну провода проложены где-то там в стене, чтобы какой-нибудь электрик от звонка случайно не запитал люстру в комнате.

Ответить
Денис Бацаев
Денис Бацаев - 13.05.2020 12:11

Полиморфизм — способность функции обрабатывать данные разных типов.
Вот пример!




abstract class Shape{




//создаем шаблон outshape() метод для каждого наследуемего класса
abstract protected function outshape();




//вызов функции outshape() исходя из объекта $this->(этот_объект)
public function draw(){
print $this->outshape(). "\n";
}




}




class Circle extends Shape{




public function outshape(){
return "<h3>Рисуем круг</h3>";
}
}




class Square extends Shape{




public function outshape(){
return "<h3>Рисуем квадрат</h3>";
}
}




class Triangle extends Shape{




public function outshape(){
return "<h3>Рисуем треугольник</h3>";
}
}








$c = new Circle();
$s = new Square();
$t = new Triangle();




$c->draw();
$s->draw();
$t->draw();
/*
Получим после исполнения скрипта:
Рисуем круг
Рисуем квадрат
Рисуем треугольник




Создаем объект каждого класса кроме абстрактного.
$c = new Circle();
$s = new Square();
$t = new Triangle();








Вызываем метод draw()
$c->draw();
$s->draw();
$t->draw();




На этапе компиляции (позднее связывание) компилятор смотрит что в созданных объектах нет метода draw() и обращается к родительскому классу. Там находит метод draw() и исходя из объекта в котором была вызванная функции draw() вызывает метод
outshape() нужного класса.
*/

Ответить
Hesoyam
Hesoyam - 18.04.2020 00:02

Самая большая сложность в ООП с которой я столкнулся, это понять, какое практическое применение этим знаниям, я до сих пор не понимаю многое, и как мне кажется, ошибка всех преподавателей в том, что они начинают рассказывать подход, но не рассказывают в каких практических ситуациях это может нам помочь((( Я уточню, принцип работы я понял, неследники класса А создают метод с разной начинкой и данными, а затем юзают метод из класса А чтобы вызвать метод из класса Б, но зачем так усложнять, можно вызвать метод сразу из нужного объекта. Я точно в чем то ошибаюсь и не говорю что это бесполезно, как-раз таки и хочется убеждаться в том, что это не бесполезно, но преподаватели просто говорят что вот так можно делать, счастливой дороги, просто знай это.

Ответить
DWW
DWW - 29.02.2020 11:48

Спрашивается - зачем называть урок "полиморфизм" если этот самый полиморфизм тут ни хрена на объясняется? Объяснить его на собственном примере и растолковать людям - это дорогого стоит. А нахайпить на названии а потом кинуть ссылку на статью, где к тому же объяснено хреново - это и есть то, что определяет понятие "говноканал". И это печально.

Ответить
Andrey Er
Andrey Er - 17.02.2020 18:13

Спасибо. Всё четко и понятно.

Ответить
Adil Makhmetov
Adil Makhmetov - 26.11.2019 21:16

Полиморфизм по русски: Ручка с двумя цветами.

Дай ручку классу Учитель - он сучара только красным пишет. Этому он научил всех студентов.
Дай ручку классу Студент - он умеет еще и синим писать.

Класс студент может писать как учитель(красным), а может хуй покласть на учителя и писать синим. Вот и все. Когда он пишет синим он использует свой метод. Когда красным метод учителя.

Метод называется писать. Что у учителя, что у студента. Апплодисменты.

Ответить
MarciTrixie
MarciTrixie - 27.05.2019 18:32

с каждым уроком просмотров все мееееньше и меееееньше. люди все брееееются и брееееются)) понимают что это не их видимо) а я. а я еще учусь) медленно но уверенно XD

Ответить
Ivan
Ivan - 11.04.2019 16:53

Автору спасибо за статью и попытку объяснить полиморфизм, но не сразу дошло мне и думаю и многим. Попытаюсь и я объяснить, может кому то моя трактовка будет более понятнее.
Есть у нас много классов с разными именами, но у всех есть метод который имеет одинаковое имя (по другому у всех есть функция с одним и тем же именем) но то, что внутри в этом методе(функции) у всех разное.
Пример:
class A{
function name() {
$per = 1;
}
}
class B{
function name() {
$type = 'b';
}
}
class C{
function name() {
$name = 'Alex';
}
}
И вот для каждого случая мы будет создавать объект с каким то классом. Так мы можем создать много объектов и запутаться в количестве этих объектов. Для того, что бы этого не произошло, нам нужно, что то одно - универсальное.
Мы может из этих классов выбрать один класс и сделать родительским для всех, но лучше создать новый класс и в него поместить метод с таким же именем и еще метод с другим именем, а во внутри второго метода будем обращаться к первому методу.
class D{
function name() {
$z = '3';
}
function call() {
name();
}
Всем классам теперь нужно добавить extends D. Получится class A extends D{}, class B extends D{}, class C extends D{}.
Для каждого класса создадим объект. И в каждом объекте вывозим метод name() то получим четыре разных результата. 1, b, Alex, 3 - ка бы логично. Но вызовем у каждого объекта метод call() то по логике он должен выдать четыре раза результат из базового класса class D - 3, но нет, будет результат 1, b, Alex, 3. Как так в других классах нет этого метода, но суть такая он выполняет метод name(), но этот метод обращается к своему классу. Вот и это и есть полиморфизм.
Может я еще больше кого то запутал, а кому то понятнее станет.

Ответить
r12Sergei
r12Sergei - 21.01.2019 20:52

понравилась закладка с хабра "что такое полиморфизм?" в браузере)

Ответить
Киберев Святослав
Киберев Святослав - 27.11.2018 21:35

Я так и не понял, зачем создавать 3 класса. В 1: мы создаем пустую функцию. А в 2,3 наследуем 1 (пустой), зачем? Нельзя просто сделать 2,3 класс без 1. Какие задачи решает 1 класс с пустой функцией?

Ответить
Developing Su
Developing Su - 02.08.2018 20:39

По поводу инкапсуляции, Private, Protected и Public - это не ключевые слова, а модификаторы доступа.

Ответить
Yelzhas Mukanov
Yelzhas Mukanov - 02.03.2018 17:48

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

Ответить
ron i
ron i - 06.01.2018 16:21

Лучше один раз послушать, чем глаза напрягать на хабрах

Ответить
Максим Храмцов
Максим Храмцов - 19.10.2017 15:18

Отличный канал , лучший из того что я видел.

Ответить
Bohdan Liango
Bohdan Liango - 30.09.2017 09:33

Коротко и ясно)

Ответить
Ivan Blohin
Ivan Blohin - 21.04.2017 13:24

Полиморфизм, конечно, понятие на самом деле простое, но показывать примеры я вам не буду, скину ссылки на статьи, сами посмотрите.
Содержание урока верно передал?

Ответить
The Academy of Comics
The Academy of Comics - 13.04.2017 20:15

Збс где примеры ? Мог бы просто оставить ссылки на статьи и всё .

Ответить