Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -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)

19 changes: 17 additions & 2 deletions app/App.php
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
<?php
namespace app;

require __DIR__ . '/../vendor/liw/core/App.php';

use liw\core\App as Application;

/**
Expand All @@ -17,4 +15,21 @@ public function __construct()
parent::__construct();
echo 'Создался новый экземпляр класса из папки "app/"<br>';
}

/**
* Всеядный метод, который может корректно отрабатывать с данными разных типов
* @param null|Data1|Data2 $data
*/
public function run($data = null)
{
echo $data->get();
}

/**
* @return string
*/
public function getVersion()
{
return 'version = 0.0.1';
}
}
20 changes: 20 additions & 0 deletions app/Data1.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php
namespace app;

class Data1
{
/**
* @var string Эти данные инкапсулированы в объект класса Data1
*/
private $lessons = 'Первые данные';

/**
* Этот метод позволяет получить данные и, предварительно обработать их
* а значит - это демонстрация инкапсуляции
* @return string
*/
public function get()
{
return $this->lessons;
}
}
13 changes: 13 additions & 0 deletions app/Data2.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php
namespace app;


class Data2
{
private $videos = "Данные о видео из второго объекта";

public function get()
{
return $this->videos;
}
}
5 changes: 0 additions & 5 deletions vendor/liw/core/App.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,4 @@ public function __construct()
{
echo 'Создался новый экземпляр класса из папки "vendor/liw/core/"<br>';
}

public function run()
{
echo 'Выполнился метод run родительского класса.';
}
}
16 changes: 13 additions & 3 deletions web/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);