From 8c4a3f743314d10f99f523b4a7cb3f63b49300c7 Mon Sep 17 00:00:00 2001 From: Razzwan Date: Sun, 13 Dec 2015 12:45:24 +0200 Subject: [PATCH 1/4] =?UTF-8?q?=D0=A3=D1=80=D0=BE=D0=BA=2010.=20=D0=9F?= =?UTF-8?q?=D0=BE=D0=BB=D0=B8=D0=BC=D0=BE=D1=80=D1=84=D0=B8=D0=B7=D0=BC=20?= =?UTF-8?q?=D0=B8=20=D0=B8=D0=BD=D0=BA=D0=B0=D0=BF=D1=81=D1=83=D0=BB=D1=8F?= =?UTF-8?q?=D1=86=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 29 +++++++++++++++++++++++++++++ app/App.php | 31 ++++++++++++++++++++++++++++++- vendor/liw/core/App.php | 11 ++++++----- web/index.php | 2 +- 4 files changed, 66 insertions(+), 7 deletions(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..bb707b7 --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +## PHP ООП. +## Урок 10. Полиморфизм и инкапсуляция - сложные названия для простых вещей + +#### Необходимо: +1. Ознакомиться с предыдущими уроками + +#### Ход урока: +1. Перейдите на ветку десятого урока командой ```git checkout lesson10 --force``` +2. +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..70c9af3 100644 --- a/app/App.php +++ b/app/App.php @@ -11,10 +11,39 @@ */ class App extends Application { + /** + * @var array - массив разрешенный путей в приложении + */ + private $path_array = [ + '/', + '/articles', + '/contacts' + ]; + public function __construct() { // Обращаемся к конструктору родительского класса parent::__construct(); - echo 'Создался новый экземпляр класса из папки "app/"
'; + echo 'Создался новый экземпляр класса из папки "app/"


'; + } + + /** + * Осуществит разные действия в зависимости от переданого аргумента: + * 1. если путь найден, то выведет соответствующую страницу + * 2. если путь не найден или не передан, то выведет страницу со статусом 404 (страница не найдена) + * и запишет для разработчика инфрмацию в файл (логирует), что произошло обращение к несуществующей странице + * @param $path + * @return mixed + */ + public function run($path = null) + { + if(in_array($path, $this->path_array)){ + echo "Путь '$path' сущестует. Выводим страницу со статусом 200"; + echo '
'; + } else { + echo "Путь '$path' не существует. Выводим страницу со статусом 404. Логируем (записываем в файл) + информацию о том, что произошло обращение к несуществующей странице"; + echo '
'; + } } } diff --git a/vendor/liw/core/App.php b/vendor/liw/core/App.php index 8a6f7cd..6aa8e88 100644 --- a/vendor/liw/core/App.php +++ b/vendor/liw/core/App.php @@ -4,15 +4,16 @@ /** * Class App */ -class App +abstract class App { public function __construct() { echo 'Создался новый экземпляр класса из папки "vendor/liw/core/"
'; } - public function run() - { - echo 'Выполнился метод run родительского класса.'; - } + /** + * @param $path + * @return mixed + */ + abstract public function run($path = null); } diff --git a/web/index.php b/web/index.php index f5319c7..e17aee8 100644 --- a/web/index.php +++ b/web/index.php @@ -11,4 +11,4 @@ $app = new app\App(); // Имеем доступ к родительскому методу. -$app->run(); // выполнит родительский метод run +$app->run(); // выведет страницу со статусом 404, т.к. маршрут не указан From 4e268c75528aaca1d2ab5bc96e461c1451a2e7cf Mon Sep 17 00:00:00 2001 From: Razzwan Date: Sun, 13 Dec 2015 12:56:56 +0200 Subject: [PATCH 2/4] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20Readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 +++++-- app/App.php | 8 ++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bb707b7..80df201 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,11 @@ #### Ход урока: 1. Перейдите на ветку десятого урока командой ```git checkout lesson10 --force``` -2. -7. Переходите к [Урок 11. Абстрактные (abstract) и финальные (final) классы и методы](https://github.com/altiore/mm/tree/lesson11) +2. Изучите файл ```app/App.php``` и найдите образец полиморфизма +3. Является ли демонстрацией полиморфмзма метод ```getVersion()``` в класс ```app/App.php```? Почему? +4. Соответствуют ли принципу инкапсуляции глобальные переменные? Почему? +5. Если вы не уверены, что правильно ответили на предыдущий вопрос, найдите ответ на него в википедии [Инкапсуляция](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)) +6. Переходите к [Урок 11. Абстрактные (abstract) и финальные (final) классы и методы](https://github.com/altiore/mm/tree/lesson11) ## Список уроков: 1. [Введение. Тестируем локальный сервер](https://github.com/altiore/mm/tree/lesson1) diff --git a/app/App.php b/app/App.php index 70c9af3..0868dd9 100644 --- a/app/App.php +++ b/app/App.php @@ -46,4 +46,12 @@ public function run($path = null) echo '
'; } } + + /** + * @return string + */ + public function getVersion() + { + return 'Liw version is 0.0.1'; + } } From 0814c16e62a6884e0fb76ceaa26dd88072fb16ea Mon Sep 17 00:00:00 2001 From: Razzwan Date: Sun, 13 Dec 2015 16:02:09 +0200 Subject: [PATCH 3/4] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/App.php | 7 ++++--- web/index.php | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/App.php b/app/App.php index 0868dd9..70dc5ac 100644 --- a/app/App.php +++ b/app/App.php @@ -38,11 +38,12 @@ public function __construct() public function run($path = null) { if(in_array($path, $this->path_array)){ - echo "Путь '$path' сущестует. Выводим страницу со статусом 200"; + echo "Путь '$path' сущестует.
Выводим страницу со статусом 200"; echo '
'; } else { - echo "Путь '$path' не существует. Выводим страницу со статусом 404. Логируем (записываем в файл) - информацию о том, что произошло обращение к несуществующей странице"; + echo "Путь '$path' не существует.
+ Выводим страницу со статусом 404.
+ Логируем (записываем в файл) информацию о том, что произошло обращение к несуществующей странице"; echo '
'; } } diff --git a/web/index.php b/web/index.php index e17aee8..0c17435 100644 --- a/web/index.php +++ b/web/index.php @@ -11,4 +11,4 @@ $app = new app\App(); // Имеем доступ к родительскому методу. -$app->run(); // выведет страницу со статусом 404, т.к. маршрут не указан +$app->run('/'); // выведет страницу со статусом 404, т.к. маршрут не указан From 94fbf3cfd46fe19ba6bb5c08938d1f1b7ecb40bc Mon Sep 17 00:00:00 2001 From: Razzwan Date: Sun, 20 Mar 2016 10:22:13 +0200 Subject: [PATCH 4/4] =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D0=B8=D0=BC=D0=BE=D1=80?= =?UTF-8?q?=D1=84=D0=B8=D0=B7=D0=BC=20=D0=B8=20=D0=B8=D0=BD=D0=BA=D0=B0?= =?UTF-8?q?=D0=BF=D1=81=D1=83=D0=BB=D1=8F=D1=86=D0=B8=D1=8F,=20=D0=B2?= =?UTF-8?q?=D0=B0=D0=B6=D0=BD=D1=8B=D0=B5=20=D1=83=D1=82=D0=BE=D1=87=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 ++++++----- app/App.php | 35 ++++++----------------------------- app/Data1.php | 20 ++++++++++++++++++++ app/Data2.php | 13 +++++++++++++ vendor/liw/core/App.php | 8 +------- web/index.php | 16 +++++++++++++--- 6 files changed, 59 insertions(+), 44 deletions(-) create mode 100644 app/Data1.php create mode 100644 app/Data2.php diff --git a/README.md b/README.md index 80df201..8dbfb32 100644 --- a/README.md +++ b/README.md @@ -6,11 +6,12 @@ #### Ход урока: 1. Перейдите на ветку десятого урока командой ```git checkout lesson10 --force``` -2. Изучите файл ```app/App.php``` и найдите образец полиморфизма -3. Является ли демонстрацией полиморфмзма метод ```getVersion()``` в класс ```app/App.php```? Почему? -4. Соответствуют ли принципу инкапсуляции глобальные переменные? Почему? -5. Если вы не уверены, что правильно ответили на предыдущий вопрос, найдите ответ на него в википедии [Инкапсуляция](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)) -6. Переходите к [Урок 11. Абстрактные (abstract) и финальные (final) классы и методы](https://github.com/altiore/mm/tree/lesson11) +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) diff --git a/app/App.php b/app/App.php index 70dc5ac..265cf38 100644 --- a/app/App.php +++ b/app/App.php @@ -1,8 +1,6 @@

'; + echo 'Создался новый экземпляр класса из папки "app/"
'; } /** - * Осуществит разные действия в зависимости от переданого аргумента: - * 1. если путь найден, то выведет соответствующую страницу - * 2. если путь не найден или не передан, то выведет страницу со статусом 404 (страница не найдена) - * и запишет для разработчика инфрмацию в файл (логирует), что произошло обращение к несуществующей странице - * @param $path - * @return mixed + * Всеядный метод, который может корректно отрабатывать с данными разных типов + * @param null|Data1|Data2 $data */ - public function run($path = null) + public function run($data = null) { - if(in_array($path, $this->path_array)){ - echo "Путь '$path' сущестует.
Выводим страницу со статусом 200"; - echo '
'; - } else { - echo "Путь '$path' не существует.
- Выводим страницу со статусом 404.
- Логируем (записываем в файл) информацию о том, что произошло обращение к несуществующей странице"; - echo '
'; - } + echo $data->get(); } /** @@ -53,6 +30,6 @@ public function run($path = null) */ public function getVersion() { - return 'Liw version is 0.0.1'; + 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 6aa8e88..ddebdf4 100644 --- a/vendor/liw/core/App.php +++ b/vendor/liw/core/App.php @@ -4,16 +4,10 @@ /** * Class App */ -abstract class App +class App { public function __construct() { echo 'Создался новый экземпляр класса из папки "vendor/liw/core/"
'; } - - /** - * @param $path - * @return mixed - */ - abstract public function run($path = null); } diff --git a/web/index.php b/web/index.php index 0c17435..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('/'); // выведет страницу со статусом 404, т.к. маршрут не указан +$data1 = new \app\Data1(); +$data2 = new \app\Data2(); + +/** + * Можем передатьв этот метод объекты разных классов - это все равно отработает корректно + * это удобно потому, что внутри класса app\App мы можем не задумываться о том, + * какие именно данные будут выводиться - можем писать код независимо + */ +$app->run($data2);