Доброго времени суток. Спасибо что читаете данный блог , даже если он так не часто обновляется. Спасибо тем кто все еще пишет комментарии на блоге, и присылает мне письма с вопросами. На те вопросы на которые я смог ответить, я ответил, на остальные же прошу прощения
О чем сегодня поговорим? А поговорим мы о наследование в ООП. Это пожалуй самое главное, без чего объектно — ориентированное программирование почти ничем не отличается от процедурного.
В прошлой заметки рубрики «Я учусь» мы писали класс кружки. Пример может и не самый удачный, тем не менее не грузит мозг, как у некоторых авторов, которые пытались объяснить, что такое классы. Сейчас мы немного изменим наш класс. Для данного урока нужно отделить методы:
От метода «Помешать содержимое кружки» — interfere_with()
Для чего это нужно? Ну начну с того что сегодня я собираюсь в месте с Вами написать класс термоса. Как Вам известно термос это тоже некая емкость в которой можно хранить напитки. В термос так же можно налить воды, положить чай или кофе и насыпать сахар. В общем то термос, в плане нашего кода, ничем не отличается от нашей кружки. Можно было бы просто скопировать класс кружки, переназвать его и делов то
Но данный подход нам не интересен, поэтому вынесем общие методы в отдельный класс. Этот класс я назвал common_actions. Вот код класса:
class common_actions
{
public $drink = '';// кофе или чай
public $water = FALSE;// вода (TRUE вода налита; FALSE вода не налита)
public $sugar = FALSE;// сахар (TRUE положили сахар; FALSE не положили сахар)
// положить кофе или чай.. ну или еще что-нить =)
function set_drink($name)
{
$this->drink = $name;
}
// налить воды
function set_water()
{
$this->water = TRUE;
}
// положить сахар
function set_sugar()
{
$this->sugar = TRUE;
}
}
Вот как сейчас выглядит мой файл:
class common_actions
{
public $drink = '';// кофе или чай
public $water = FALSE;// вода (TRUE вода налита; FALSE вода не налита)
public $sugar = FALSE;// сахар (TRUE положили сахар; FALSE не положили сахар)
// положить кофе или чай.. ну или еще что-нить =)
function set_drink($name)
{
$this->drink = $name;
}
// налить воды
function set_water()
{
$this->water = TRUE;
}
// положить сахар
function set_sugar()
{
$this->sugar = TRUE;
}
}
class glass
{
// мешать содержимое кружки ложкой
function interfere_with()
{
if (empty($this->drink) AND $this->water == FALSE AND $this->sugar == FALSE)
return "Дзынь-дзынь... кружка пуста, и я не знаю какого результата Вы ждете =(";
if (!empty($this->drink) AND $this->water == FALSE AND $this->sugar == FALSE)
return "Странный скрежет... К сожалению результата нет =(";
if (!empty($this->drink) AND $this->water == TRUE AND $this->sugar == FALSE)
return "Дзынь-дзынь... Ура! Вы получили НЕ сладкий ".$this->drink;
if (!empty($this->drink) AND $this->water == TRUE AND $this->sugar == TRUE)
return "Дзынь-дзынь... Ура! Вы получили сладкий ".$this->drink;
if (empty($this->drink) AND $this->water == TRUE AND $this->sugar == TRUE)
return "Дзынь-дзынь... Ура! Вы получили cладкую воду";
if (empty($this->drink) AND $this->water == FALSE AND $this->sugar == TRUE)
return "Странный скрежет... К сожалению результата нет =(";
if (empty($this->drink) AND $this->water == TRUE AND $this->sugar == FALSE)
return "Дзынь-дзынь... В кружке просто вода";
if (!empty($this->drink) AND $this->water == FALSE AND $this->sugar == TRUE)
return "Странный скрежет... К сожалению результата нет =(";
}
}
$glass = new glass();
$glass->set_drink('кофе');// насыпим кофе
$glass->set_sugar();// насыпим сахар
$glass->set_water();// зальем водой
echo $glass->interfere_with();// помешаем
Если Вы его сейчас запустите, то ничего хорошего у Вас не получится, но Вы не расстраивайтесь , мы лишь привели код к нужному нам виду.
Во избежание всяких ошибок, я выкладываю данный файл. Скачать его можно вот тут
Если Вы взгляните сейчас на наш файл, а именно на класс glass, то увидите там лишь один метод, метод interfere_with(). Отсюда можно сделать вывод, что класс термоса должен иметь что-то подобное. Но как нам известно у термоса есть еще крышка, поэтому я предлагаю создать метод в классе термоса, который бы позволял открыть и закрыть крышку.
Давай приступим к созданию нового класса (Я пишу код в том же файле)
class thermos
{
public $cover = FALSE;// крышка термоса закрыта (false) иои открыта (true)
function action_cover()
{
if ($this->cover == FALSE)
$this->cover = TRUE;
else
$this->cover = FALSE;
}
// мешать содержимое термоса
function interfere_with()
{
// новое условие позволяющие определить открыта или закрыта крышка у термоса
if ($this->cover == FALSE)
return "Крышка закрыта, удивитеьлно что Вы сразу не заметили";
if (empty($this->drink) AND $this->water == FALSE AND $this->sugar == FALSE)
return "Дзынь-дзынь... термос пуст, и я не знаю какого результата Вы ждете =(";
if (!empty($this->drink) AND $this->water == FALSE AND $this->sugar == FALSE)
return "Странный скрежет... К сожалению результата нет =(";
if (!empty($this->drink) AND $this->water == TRUE AND $this->sugar == FALSE)
return "Дзынь-дзынь... Ура! Вы получили НЕ сладкий ".$this->drink;
if (!empty($this->drink) AND $this->water == TRUE AND $this->sugar == TRUE)
return "Дзынь-дзынь... Ура! Вы получили сладкий ".$this->drink;
if (empty($this->drink) AND $this->water == TRUE AND $this->sugar == TRUE)
return "Дзынь-дзынь... Ура! Вы получили cладкую воду";
if (empty($this->drink) AND $this->water == FALSE AND $this->sugar == TRUE)
return "Странный скрежет... К сожалению результата нет =(";
if (empty($this->drink) AND $this->water == TRUE AND $this->sugar == FALSE)
return "Дзынь-дзынь... В термосе просто вода";
if (!empty($this->drink) AND $this->water == FALSE AND $this->sugar == TRUE)
return "Странный скрежет... К сожалению результата нет =(";
}
}
Класс я назвал thermos, Создал в нем новое свойство cover. Данное свойство будет определять открытия или закрытие крышки.
Метод action_cover() позволяет менять состояние крышки (т.е. метод меняет значение с true на false и обратно). В методе interfere_with() появилось новое условие, позволяющие определить открыта крышка или нет.
Ну что же, теперь у нас есть класс термоса, но работать он пока не будет, так как он еще не знает таких методов как:
Вот тут то как раз иприходит к нам на помощь чудо-штука под название наследование. В чем ее смысл?
В нашем примере видно что есть три класса:
Нам известно, что два последних класса используют методы из первого класса и нам необходимо сделать так что бы первый класс стал родителем второго и третьего класса, то есть что бы два последних класса стали дочерними первого.
Проще говоря в ООП есть возможность использовать методы которые находятся в другом классе. Для этого необходимо указать родителя (тот класс из которого мы хотим взять методы). Делается это проще простого. После объявление имени класса, необходимо написать ключевое слово extends после чего необходимо написать имя класса родителя (класса из которого необходимо взять методы)
В коде это выглядит вот так:
class glass extends common_actions
{
...
}
class thermos extends common_actions
{
..
}
Теперь наши класс кружка и термос могут использовать методы которые лежат в класса common_actions
Давайте протестируем наши классы. Для этого в самом низу напишем вот этот код:
// завариваем напиток в кружке
$glass = new glass();
$glass->set_drink('кофе');// насыпим кофе
$glass->set_sugar();// насыпим сахар
$glass->set_water();// зальем водой
echo $glass->interfere_with();// помешаем
// завариваем напиток в термосе
$thermos = new thermos();
$thermos->action_cover();// откроем крышку термоса
$thermos->set_drink('чай');// насыпим кофе
$thermos->set_sugar();// насыпим сахар
$thermos->set_water();// зальем водой
echo "<br /><br />".$thermos->interfere_with();// помешаем
После запуска я получил вот такой результат:
Надеюсь смысл наследования Вам ясен. На практике (т.е. при построение той же CMS) наследование используется для того чтобы получить доступ к методам ядра, которое содержит в себе инструменты по работе с данными, базой данных и т.д
Прежде чем закончить данную статью, я выложу Вам готовый файл который сегодня получился у меня, Вам так будет проще разобраться в том что я написал . Файл можно скачать вот отсюда. Если у Вас есть какие либо вопросы, то задавайте, с удовольствием попытаюсь ответить
Всего Вам наилучшего, у меня все!
вставляю в menu.tpl.php:
<ul class="menu">
[_divmenu]
<li>
[_station]
<ul>
<li>
[_podmenu]
</li>
</ul>
</li>
[_divmenu]
</ul>
открываю на сайте и он отображает его криво и открываю исходный код страница а там вот:
<ul class="menu">
<li>
<a href="/about.html">Обо мне</a>
<ul>
<li>
<li>
<a href="/">Главная</a>
<ul>
<li>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
и в чём может быть проблема? у меня создан 1 пункт и один подпункт для того чтобы показать всплывающее меню. помогите пожалуйста :)
Вы какой версией RS-BLOG пользуетесь? Той, что по почте Вам прислали, или той, что собрали во время прохождения цикла статей "Создать блог с нуля"?
1. Обернуть весь список в код-слова [_divmenu], т.е. приблизительно вот так:
2. Обернуть подменю в коде модуля menu.php. Файл находится в папке moduls. Найдите там вот эту строчку:
с меню у меня все решено) и вот как сделать как у вас? скрин: http://rghost.ru/47972433/image.png
короче помните вы мне помогли функцию BB-code помогли внедрить? и вот в этой функции при вставке url можно только например так:
Вот регулярки которые должны работать с выше представленными примерами: