diff --git a/README.md b/README.md new file mode 100644 index 0000000..8dbfb32 --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +## PHP ООП. +## Урок 10. Полиморфизм и инкапсуляция - сложные названия для простых вещей + +#### Необходимо: +1. Ознакомиться с предыдущими уроками + +#### Ход урока: +1. Перейдите на ветку десятого урока командой ```git checkout lesson10 --force``` +2. Изучите файл ```app/App.php``` и найдите метод, реализующий принцип полиморфизма +3. Создайте свой объект, который ссможет обработать метод ```run()``` класса ```app\App``` +4. Является ли демонстрацией инкапсуляции метод ```getVersion()``` в класс ```app/App.php```? Почему? +5. Соответствуют ли принципу инкапсуляции глобальные переменные? Почему? +6. Если вы не уверены, что правильно ответили на предыдущий вопрос, найдите ответ на него в википедии [Инкапсуляция](https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%BA%D0%B0%D0%BF%D1%81%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)) +7. Переходите к [Урок 11. Абстрактные (abstract) и финальные (final) классы и методы](https://github.com/altiore/mm/tree/lesson11) + +## Список уроков: +1. [Введение. Тестируем локальный сервер](https://github.com/altiore/mm/tree/lesson1) +2. [Класс (class). Свойства и методы класса](https://github.com/altiore/mm/tree/lesson2) +3. [Область видимости свойств и методов класса (private, public, protected)](https://github.com/altiore/mm/tree/lesson3) +4. [Статические (static) свойства и методы](https://github.com/altiore/mm/tree/lesson4) +5. [Ключевые слова $this, self, static](https://github.com/altiore/mm/tree/lesson5) +6. [Магические методы (__construct(), __invoke()... )](https://github.com/altiore/mm/tree/lesson6) +7. [Типичная структура рабочих папок](https://github.com/altiore/mm/tree/lesson7) +8. [Пространство имен (namespace)](https://github.com/altiore/mm/tree/lesson8) +9. [Наследование (extends), ключевое слово "parent::"](https://github.com/altiore/mm/tree/lesson9) +10. [Полиморфизм и инкапсуляция - сложные названия простых вещей](https://github.com/altiore/mm/tree/lesson10) +11. [Абстрактные (abstract) и финальные (final) классы и методы](https://github.com/altiore/mm/tree/lesson11) +12. [Автоматическая загрузка (autoload) классов](https://github.com/altiore/mm/tree/lesson12) +13. [Интерфейс (interface). Сходства с абстрактным классом, различия](https://github.com/altiore/mm/tree/lesson13) +14. [Трэйт (trait)](https://github.com/altiore/mm/tree/lesson14) +15. [Обработка ошибок (error hendler), исключения (exceptions)](https://github.com/altiore/mm/tree/lesson15) +16. [Замыкания (closure)](https://github.com/altiore/mm/tree/lesson16) + diff --git a/app/App.php b/app/App.php index c451acb..265cf38 100644 --- a/app/App.php +++ b/app/App.php @@ -1,8 +1,6 @@ '; } + + /** + * Всеядный метод, который может корректно отрабатывать с данными разных типов + * @param null|Data1|Data2 $data + */ + public function run($data = null) + { + echo $data->get(); + } + + /** + * @return string + */ + public function getVersion() + { + return 'version = 0.0.1'; + } } diff --git a/app/Data1.php b/app/Data1.php new file mode 100644 index 0000000..5a4bfe6 --- /dev/null +++ b/app/Data1.php @@ -0,0 +1,20 @@ +lessons; + } +} diff --git a/app/Data2.php b/app/Data2.php new file mode 100644 index 0000000..53d0f6a --- /dev/null +++ b/app/Data2.php @@ -0,0 +1,13 @@ +videos; + } +} diff --git a/vendor/liw/core/App.php b/vendor/liw/core/App.php index 8a6f7cd..ddebdf4 100644 --- a/vendor/liw/core/App.php +++ b/vendor/liw/core/App.php @@ -10,9 +10,4 @@ public function __construct() { echo 'Создался новый экземпляр класса из папки "vendor/liw/core/"
'; } - - public function run() - { - echo 'Выполнился метод run родительского класса.'; - } } diff --git a/web/index.php b/web/index.php index f5319c7..725669e 100644 --- a/web/index.php +++ b/web/index.php @@ -4,11 +4,21 @@ * На этот файл будут переадресованы все запросы нашего сайта. */ -// Подключили файл из папки app +// Подключаем необходимые файлы +require __DIR__ . '/../vendor/liw/core/App.php'; require __DIR__ . '/../app/App.php'; +require __DIR__ . '/../app/Data1.php'; +require __DIR__ . '/../app/Data2.php'; // создали новый объект класса из папки vendor $app = new app\App(); -// Имеем доступ к родительскому методу. -$app->run(); // выполнит родительский метод run +$data1 = new \app\Data1(); +$data2 = new \app\Data2(); + +/** + * Можем передатьв этот метод объекты разных классов - это все равно отработает корректно + * это удобно потому, что внутри класса app\App мы можем не задумываться о том, + * какие именно данные будут выводиться - можем писать код независимо + */ +$app->run($data2);