ООП и PHP. часть 1 — наследование
Итак, сегодня речь пойдет об ооп в пыхе. Предпологается(раз ты это читаешь) — ты уже встречался с этим словом =)
Зачем это все писать — об этом и так куча разных книг/статей/еще чего-то
Считаю, что большинство из них переполнено термонологией и порой не совсем легки для восприятия(имхо).
Для кого это написано?
Очевидно, для людей, которые хотят поскорее вникнуть в основы ооп, не перерывая при этом кучу литературы/манов (хотя, надо отдать должное — это порой довольно полезное занятие).
Вступление
Итак, ты уже прочитал пару-тройку статей/книг по пхп и теперь считаешь себя мега-кодером? Однако читая хабр/форумы/т.п. ты встречаешь многа букв по поводу ООП в пхп? — Тогда надеюсь, эти статьи хоть немного помогут тебе понять/запутаться (нужное подчеркнуть) в сабже =)
Поехали
Как ты уже знаешь(или сейчас узнаешь), ключевыми понятиями ооп есть: наследования, абстракция, полиморфизм и инкапсуляция.
И начнем мы с наследования.
Жила-была, значит, одна маленькая черная… кошка =). И была у нашей кошки одна интересная особенность — она умела гавкать =). И как-то так получилось, что в один прекрасный день, родился у нее котенок.
Так что же получилось в итоге? — наш котенок унаследовал основые функции котов: бегать, спать, жрать /и т.п.
И ты, наверное, подумал, что стал наш котенок копией мамаши? — Ан нет, оказалось, что гавкать он так и не научился, но вместо этого стал говорить по-человечески =)
Итак, кошка будет выступать родительским классом =)
Начнем-с…
Итак, сегодня речь пойдет об ооп в пыхе. Предпологается(раз ты это читаешь) — ты уже встречался с этим словом =)
Зачем это все писать — об этом и так куча разных книг/статей/еще чего-то
Считаю, что большинство из них переполнено термонологией и порой не совсем легки для восприятия(имхо).
Для кого это написано?
Очевидно, для людей, которые хотят поскорее вникнуть в основы ооп, не перерывая при этом кучу литературы/манов (хотя, надо отдать должное — это порой довольно полезное занятие).
Вступление
Итак, ты уже прочитал пару-тройку статей/книг по пхп и теперь считаешь себя мега-кодером? Однако читая хабр/форумы/т.п. ты встречаешь многа букв по поводу ООП в пхп? — Тогда надеюсь, эти статьи хоть немного помогут тебе понять/запутаться (нужное подчеркнуть) в сабже =)
Поехали
Как ты уже знаешь(или сейчас узнаешь), ключевыми понятиями ооп есть: наследования, абстракция, полиморфизм и инкапсуляция.
И начнем мы с наследования.
Пункт 1 — Предистория
Жила-была, значит, одна маленькая черная… кошка =). И была у нашей кошки одна интересная особенность — она умела гавкать =). И как-то так получилось, что в один прекрасный день, родился у нее котенок.
Так что же получилось в итоге? — наш котенок унаследовал основые функции котов: бегать, спать, жрать /и т.п.
И ты, наверное, подумал, что стал наш котенок копией мамаши? — Ан нет, оказалось, что гавкать он так и не научился, но вместо этого стал говорить по-человечески =)
Пункт 2 — Кодим предисторию
Итак, кошка будет выступать родительским классом =)
Начнем-с…
<?php
class Cat {
public function __construct(){
//добавляем основной функционал котов :)
}
public function talk($text){
//главная фича кошки
//гавкаем
}
}
* This source code was highlighted with Source Code Highlighter.
Думаю, здесь все ясно. Метод talk(), как ты уже понял, отвечают за странную особенность нашей кошки.
И родила наша кошка котенка:
Приступим-с к наследнику =)
<?php
class Kitten extends Cat{
public function __construct(){
//вызываем конструктор кошки
parent::__construct();
}
}
* This source code was highlighted with Source Code Highlighter.
Теперь наш котенок умеет все то же, что и его мама…
<?php
$kitten = new Kitten();
$kitten->talk('гав гав');
?>
Хм… ах да, забыл — котенок должен ни гавкоть, а разговаривать =)
Так что же теперь делать? — Просто переопределим метод разговора (с гавканья на разговор).
<?php
class Kitten extends Cat{
public function __construct(){
//вызываем конструктор кошки
parent::__construct();
}
public function talk($text){
//просто создаем новый метод с таким же названием
//разговариваем
}
}?>
* This source code was highlighted with Source Code Highlighter.
и получаем
<?php
$kitten = new Kitten();
$kitten->talk('превед хабрачелавек=)');
?>
* This source code was highlighted with Source Code Highlighter.
Пункт 3 — Более реальные примеры или когда можно/нужно использовать наследование.
— Ты используешь чужую библиотеку/класс и решил его расширить (для своих нужд), тобишь дописать/переписать несколько необходимых _тебе методов.
— Ты решил использовать абстрактные классы в какой-то части своего приложения. Тут, естетсвенно, тебе поможет механизм наследования. (Об абстрактных классах, если ты захочешь, сможем поговорить в другой раз).
— Ты используешь механизм полиморфизма. (И об нем, мы, может, тоже поговорим ;) ).
— Ты пишешь свой фреймворк(хм, хотя таки странно, учитывая, что ты это читаешь :))? — Тогда для контроллера/модели можно/нужно использовать наследования.
Пункт 4 — Злоключение
— Что делать, если ты по каким-либо причинам не хочешь при написании класса оставить возможность его переопределять? — Добавить ключевое слово final перед объявлением метода
final public function do_smth(){}
* This source code was highlighted with Source Code Highlighter.
з.ы. Надеюсь, что в песочнице хоть кому-то это понравицо (очень надеюсь:)), а главное — для кого-то будет полезно. Спасибо =)
з.ы.2. Если инвайт я все-таки получу, то цикл статей продолжицо =)
_________
Текст подготовлен в ХабраРедакторе