Только начал изучать эту книгу и вопрос по коду в ней PHP: <?php interface Band { public function getName(); public function getGenre(); public function addMusician(); public function getMusicians(); } interface Musician { public function addInstrument(); public function getInstruments(); public function assignToBand(); public function getMusicianType(); } interface Instrument { public function getName(); public function getCategory(); } class Guitarist implements Musician { private $last; private $first; private $musicianType; private $instruments; private $bandReference; function __construct($first, $last) { $this->last = $last; $this->first = $first; $this->instruments = array(); $this->musicianType = "guitarist"; } public function getName() { return $this->first . " " . $this->last; } public function addInstrument(Instrument $instrument) { array_push($this->instruments, $instrument); } public function getInstruments() { return $this->instruments; } public function getBand() { return $this->$bandReference; } public function assignToBand(Band $band) { $this->$bandReference = $band; } public function getMusicianType() { return $this->musicianType; } public function setMusicianType($musicianType) { $this->musicianType = $musicianType; } } class LeadGuitarist extends Guitarist { function __construct($last, $first) { parent::__construct($last, $first); $this->setMusicianType("lead guitarist"); } } class RockBand implements Band { private $bandName; private $bandGenre; private $musicians; function __construct($bandName) { $this->bandName = $bandName; $this->musicians = array(); $this->bandGenre = "rock"; } public function getName() { return $this->bandName; } public function getGenre(){ return $this->bandGenre; } public function addMusician(Musician $musician){ array_push($this->musicians, $musician); $musician->assignToBand($this); } public function getMusicians() { return $this->musicians; } } class Guitar implements Instrument { private $name; private $category; function __construct($name) { $this->name = $name; $this->category = "guitar"; } public function getName() { return $this->name; } public function getCategory() { return $this->category; } } // Test Objects $band = new RockBand("Изменчивые"); $bandMemberA = new Guitarist("Джек", "Флот"); $bandMemberB = new LeadGuitarist("Джим", "Интеджер"); $bandMemberA->addInstrument(new Guitar("Gibson Les Paul")); $bandMemberB->addInstrument(new Guitar("Fender Stratocaster")); $bandMemberB->addInstrument(new Guitar("Hondo H-77")); $band->addMusician($bandMemberA); $band->addMusician($bandMemberB); foreach($band->getMusicians() as $musician) { echo "Musician ".$musician->getName() . "<br>"; echo "is the " . $musician->getMusicianType() . "<br>"; echo "in the " . $musician->getBand()->getGenre() . " band <br>"; echo "called " . $musician->getBand()->getName() . "<br>"; foreach($musician->getInstruments() as $instrument) { echo "And plays the " . $instrument->getName() . " "; echo $instrument->getCategory() . "<br>"; } echo "<p>"; } ?> и сообщение при этом: Fatal error: Declaration of Guitarist::addInstrument() must be compatible with that of Musician::addInstrument() in Z:\home\localhost\www\t\sampleCode.php on line 23 О какой совместимости говорит PHP?[/b]
Да дело не во всем коде. Принадлежность к интерфейсу пишется при объявлении класса, что и сделано Но почему-то здесь Снова пытаются приписать интерфейс, только уже к экземпляру класса, причем простой припиской названия интерфейса =\
:shock: век живи -- век учись P.S. Так в коде указывается не тип, а интерфейс. Или я опять чего-то не понял?
А там тип и нельзя указать))) Там можно указать класс, интерфейс, или array — для получения массива. К сожалению, (или к счастью?) нельзя указывать простые типы — ноги этого растут из старого автокастинга типов в пхп, который, естественно, не применим к массивам, классам, и интерфейсам. Предвосхищая вопрос, разница между указанием класса и интерфейса есть: указывая имя класса, ты требуешь, что бы передаваемый обьект был этого класса, или обьектом потомка этого класса, указывая интерфейс, ты требуешь, что бы переданный обьект реализовывал интерфейс (независимо от его иерархии)
Если запутный класс - значит уже для профессионалов. Да, блин, запутаный класс - это професионально, и фиг с тем, что 152 строки можно заменить красивой функцией из 15.
Greg1978 В интерфейсе функция определяется так: public function addInstrument(); А в классе, который якобы соответствует этому интерфейсу, она определяется уже так: public function addInstrument(Instrument $instrument) Разница заметна? Чего же вы от PHP хотите? Приведенный класс, кстати, типичный презерватив на ООП :/
Всё понял!Спасибо!Просто, я так понял, что как декларирование функции так и её описание должно быть с указанием в аргументах значения.В интерфейсе и в самом классе!? Как же тогда - это опечатка такая в книге или есть другие способы описания.
флоппик Я не спорю. Но тем не менее, люди сызмальства приучаются именно к таким примерам. А потом появляются сам знаешь какие системы на ООП. С точно такими же классами, делающими ничего, зато выглядящими зело красиво...
to dagdamor to Elkaz Почему бы вам тогда не написать свою книгу? или хотя бы статью, обучающую правильному написанию систем на ООП? Даже выложенный здесь небольшой грамотный - по вашему мнению - обучающий пример, думаю, был бы интересен и полезен. Или напишите конкретно, что именно плохо в примере, предложенном авторами книги "php5 для профессионалов". А пространные замечания - о том, что типа все плохо-плохо в этом коде (а как надо-то?????) - бессмысленны, по-моему.
Dagdamor флоппик Greg1978 Я считаю эту книгу просто превосходной. И написано же там "для профессионалов", да есть там некоторые неточности в коде, но это примеры не для того чтобы их выполнять, а совсем для другого. Господин Greg1978 мое сугубо личное мнение - внимательнее читайте текст и попытайтесь полностью понять, что хотят донести до вас авторы, ибо вы с этой книгой далеко не уйдете. Многие примеры там расчитаны на то, что вы их и набирать не будете, а напишите свои по таким принципам.