[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: ООП Полиморфизм
kent666
Всем привет!
Подскажите принцип действия класса (полиморфизм)
<?php

class
Food
{
public $way;

public function __construct($way)
{
$this->way = $way;
$this->prepare_food();
$this->eat_food();
}

public function prepare_food()
{
$this->eat = $this->way . $this->set_products();
}

public function eat_food()
{
$this->eat = 'кушать '. $this->eat; }
/*
* Новый метод с продуктами
*/

protected function set_products()
{
return 'трюфеля, патиссон';
}

public function fast_food()
{
return $this->eat; [php]
}
}


$stomach = new Food('варёные ');
echo $stomach -> fast_food();
По идее при выполнении данного кода сервер должен был выдать пустое значение, так как метод fast_food() содержит в себе неопределенную переменную $this->eat
Как работает конструктор???
Ведь именно в нем приготавливается переменная $this->eat
$this->prepare_food(); - ссылается на метод set_products()
$this->eat_food(); добавляется "кушать"!!!
То есть по сути в конструкторе можно определить не только значения внутренних переменным класса (как $this->way = $way) а так же выставить порядок срабатывания первоочередных методов класса ???



Спустя 14 минут, 26 секунд (9.05.2011 - 11:19) alex12060 написал(а):
Цитата
По идее при выполнении данного кода сервер должен был выдать пустое значение, так как метод fast_food() содержит в себе неопределенную переменную $this->eat


Не верно.

Спустя 3 минуты, 51 секунда (9.05.2011 - 11:23) alex12060 написал(а):
Вообще, конструктор в данном случае получает слово, которое именуется переменной $way.

Далее он записывает это свойство: $this->way = $way;. Это ты понимаешь наверное.

Далее передается управление методам класса, которые в свою очередь взаимодействуют друг с другом.

Но а потом уже, вызывается метод, который уже содержит в себе все свойства и методы, которые стоят перед ним.

Понимаешь, когда конструктор передал управление методам класса, то изменения, которые происходили, они никуда не делись, они остались в памяти, поэтому, метод fast_food() просто обращался к ним, и получал значение.

Как-то так smile.gif

Спустя 15 минут, 12 секунд (9.05.2011 - 11:38) kent666 написал(а):
В общем я правильно понял суть конструктора в данном примере
Цитата
То есть по сути в конструкторе можно определить не только значения внутренних переменным класса (как $this->way = $way) а так же выставить порядок срабатывания первоочередных методов класса

А вот еще вопрос
<?php

/*
* class Food
* @base
*/

class Food
{

public $way;

public function __construct($way)
{
$this->way = $way;
$this->prepare_food();
$this->eat_food();
}

public function prepare_food()
{
// Здесь вызываем метод, которого еще толком нет
$this->eat = $this->way . $this->set_products();
}

public function eat_food()
{
$this->eat = 'кушать '. $this->eat;
}
// Пустой виртуальный метод
protected function set_products()
{
// Тут будем выбирать продукты
}

}


/*
* class Soup
* @extends Food
*/

class Soup extends Food
{

public function __construct()
{
parent::__construct('варёные ');
}
// А это уже конкретный метод, который и переопределит базовый
public function set_products()
{
return 'трюфеля, патиссон';
}

public function fast_food()
{
return $this->eat;
}

}


$soup = new Soup();
echo $soup -> fast_food();
В данном примере у нас два конструктора
1 конструктор принадлежит родительскому классу Food
2 конструктор дочернему классу Soup
Какая очередность обработки классов? Сначала обрабатывается дочерний клас а потом базовый или наоборот?

Спустя 11 минут, 36 секунд (9.05.2011 - 11:50) sharki написал(а):
kent666
Конструктор класса Soup запустить конструктором конструктор Food =)

Спустя 25 секунд (9.05.2011 - 11:50) kent666 написал(а):
почему не сработает???
Мы в дочернем конструкторе передаем значение переменной $way
parent::__construct('варёные ')
А в конструкторе Food определяется значение переменной $this->way и указываются первоочередные методы
$this->prepare_food();
$this->eat_food();

а без них переменная $this->eat будет пустая.

Спустя 52 секунды (9.05.2011 - 11:51) sharki написал(а):
kent666
Да я с просони не заметил parent:: ))

Спустя 10 минут, 15 секунд (9.05.2011 - 12:01) kent666 написал(а):
А как задать переменную $way вне класса через дочерний класс
Т.е. сработает такое правильно?
....
public function __construct($way2)
{
parent::__construct($way2);
}
.....
$soup = new Soup('варёные ');
echo $soup -> fast_food();

Спустя 13 минут, 21 секунда (9.05.2011 - 12:15) sharki написал(а):
Да, по идее сработает =)

Странные вопросы на самом деле "Т.е. сработает такое правильно?", берешь да и проверяешь, комп не взорвется

Спустя 8 минут, 10 секунд (9.05.2011 - 12:23) kent666 написал(а):
Я пробовал. Просто мне интересно знать правильно ли так обозначать переменную или может есть какие то другие методы.
В ООП каждый раз натыкаешься на какие то "особенности"))))
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.