Подскажите принцип действия класса (полиморфизм)
<?phpПо идее при выполнении данного кода сервер должен был выдать пустое значение, так как метод fast_food() содержит в себе неопределенную переменную $this->eat
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();
Как работает конструктор???
Ведь именно в нем приготавливается переменная $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() просто обращался к ним, и получал значение.
Как-то так
Далее он записывает это свойство: $this->way = $way;. Это ты понимаешь наверное.
Далее передается управление методам класса, которые в свою очередь взаимодействуют друг с другом.
Но а потом уже, вызывается метод, который уже содержит в себе все свойства и методы, которые стоят перед ним.
Понимаешь, когда конструктор передал управление методам класса, то изменения, которые происходили, они никуда не делись, они остались в памяти, поэтому, метод fast_food() просто обращался к ним, и получал значение.
Как-то так

Спустя 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 =)
Конструктор класса Soup запустить конструктором конструктор Food =)
Спустя 25 секунд (9.05.2011 - 11:50) kent666 написал(а):
почему не сработает???
Мы в дочернем конструкторе передаем значение переменной $way
parent::__construct('варёные ')
А в конструкторе Food определяется значение переменной $this->way и указываются первоочередные методы
$this->prepare_food();
$this->eat_food();
а без них переменная $this->eat будет пустая.
Мы в дочернем конструкторе передаем значение переменной $way
parent::__construct('варёные ')
А в конструкторе Food определяется значение переменной $this->way и указываются первоочередные методы
$this->prepare_food();
$this->eat_food();
а без них переменная $this->eat будет пустая.
Спустя 52 секунды (9.05.2011 - 11:51) sharki написал(а):
kent666
Да я с просони не заметил parent:: ))
Да я с просони не заметил 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 написал(а):
Я пробовал. Просто мне интересно знать правильно ли так обозначать переменную или может есть какие то другие методы.
В ООП каждый раз натыкаешься на какие то "особенности"))))
В ООП каждый раз натыкаешься на какие то "особенности"))))