За последние 24 часа нас посетили 66875 программистов и 1637 роботов. Сейчас ищут 984 программиста ...

PHP5 для профессионалов

Тема в разделе "PHP для новичков", создана пользователем Greg1978, 14 дек 2008.

  1. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    Только начал изучать эту книгу и вопрос по коду в ней
    PHP:
    1.  
    2. <?php
    3.  
    4.   interface Band {
    5.      public function getName();
    6.      public function getGenre();
    7.      public function addMusician();
    8.      public function getMusicians();
    9.   }
    10.  
    11.   interface Musician {
    12.      public function addInstrument();
    13.      public function getInstruments();
    14.      
    15.      public function assignToBand();
    16.      public function getMusicianType();
    17.   }
    18.  
    19.   interface Instrument {
    20.      public function getName();
    21.      public function getCategory();
    22.   }
    23.  
    24.   class Guitarist implements Musician {
    25.  
    26.     private $last;
    27.     private $first;
    28.     private $musicianType;
    29.  
    30.     private $instruments;
    31.     private $bandReference;
    32.    
    33.     function __construct($first, $last) {
    34.        $this->last = $last;
    35.        $this->first = $first;
    36.        $this->instruments = array();
    37.        $this->musicianType = "guitarist";
    38.     }
    39.  
    40.     public function getName() {
    41.       return $this->first . " " . $this->last;
    42.     }
    43.    
    44.     public function addInstrument(Instrument $instrument) {
    45.        array_push($this->instruments, $instrument);
    46.     }
    47.    
    48.     public function getInstruments() {
    49.        return $this->instruments;
    50.     }
    51.    
    52.     public function getBand() {
    53.        return $this->$bandReference;
    54.     }
    55.    
    56.     public function assignToBand(Band $band) {
    57.       $this->$bandReference = $band;
    58.     }
    59.  
    60.     public function getMusicianType() {
    61.        return $this->musicianType;
    62.     }      
    63.    
    64.     public function setMusicianType($musicianType) {
    65.        $this->musicianType = $musicianType;
    66.     }
    67.    
    68.   }
    69.  
    70.  
    71.   class LeadGuitarist extends Guitarist {
    72.     function __construct($last, $first) {
    73.            parent::__construct($last, $first);
    74.            $this->setMusicianType("lead guitarist");
    75.     }
    76.   }
    77.  
    78.  
    79.   class RockBand implements Band {
    80.  
    81.     private $bandName;
    82.     private $bandGenre;
    83.     private $musicians;
    84.  
    85.     function __construct($bandName) {
    86.        $this->bandName = $bandName;
    87.        $this->musicians = array();
    88.        $this->bandGenre = "rock";
    89.     }
    90.  
    91.     public function getName() {
    92.        return $this->bandName;
    93.     }
    94.            
    95.     public function getGenre(){
    96.        return $this->bandGenre;
    97.     }
    98.        
    99.     public function addMusician(Musician $musician){
    100.        array_push($this->musicians, $musician);
    101.        $musician->assignToBand($this);
    102.     }
    103.    
    104.     public function getMusicians() {
    105.        return $this->musicians;
    106.     }
    107.   }
    108.  
    109.  
    110.   class Guitar implements Instrument {
    111.    
    112.     private $name;
    113.     private $category;
    114.    
    115.     function __construct($name) {
    116.        $this->name = $name;
    117.        $this->category = "guitar";
    118.     }
    119.    
    120.     public function getName() {
    121.        return $this->name;
    122.     }
    123.    
    124.     public function getCategory() {
    125.        return $this->category;
    126.     }
    127.   }
    128.  
    129.   // Test Objects
    130.   $band = new RockBand("Изменчивые");
    131.   $bandMemberA = new Guitarist("Джек", "Флот");
    132.   $bandMemberB = new LeadGuitarist("Джим", "Интеджер");
    133.  
    134.   $bandMemberA->addInstrument(new Guitar("Gibson Les Paul"));
    135.   $bandMemberB->addInstrument(new Guitar("Fender Stratocaster"));
    136.   $bandMemberB->addInstrument(new Guitar("Hondo H-77"));
    137.  
    138.   $band->addMusician($bandMemberA);
    139.   $band->addMusician($bandMemberB);
    140.  
    141.   foreach($band->getMusicians() as $musician) {
    142.     echo "Musician ".$musician->getName() . "<br>";
    143.     echo "is the " . $musician->getMusicianType() . "<br>";
    144.     echo "in the " . $musician->getBand()->getGenre() . " band <br>";
    145.     echo "called " . $musician->getBand()->getName() . "<br>";
    146.                  
    147.     foreach($musician->getInstruments() as $instrument) {
    148.        echo "And plays the " . $instrument->getName() . " ";
    149.        echo $instrument->getCategory() . "<br>";
    150.     }
    151.     echo "<p>";
    152.   }
    153. ?>
    154.  
    155.  
    и сообщение при этом:
    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]
     
  2. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    А чего это такое, если не секрет?
     
  3. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    Может весь код выложить?
     
  4. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    Уже добавил!
     
  5. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Да дело не во всем коде. Принадлежность к интерфейсу пишется при объявлении класса, что и сделано
    Но почему-то здесь
    Снова пытаются приписать интерфейс, только уже к экземпляру класса, причем простой припиской названия интерфейса =\
     
  6. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Крутой скрипт
     
  7. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    А может это "строгая" передача типа аргумента?
    public function addInstrument(Instrument $instrument)
     
  8. Это называется forced type hinting
     
  9. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    :shock: век живи -- век учись

    P.S. Так в коде указывается не тип, а интерфейс. Или я опять чего-то не понял?
     
  10. А там тип и нельзя указать)))

    Там можно указать класс, интерфейс, или array — для получения массива. К сожалению, (или к счастью?) нельзя указывать простые типы — ноги этого растут из старого автокастинга типов в пхп, который, естественно, не применим к массивам, классам, и интерфейсам.

    Предвосхищая вопрос, разница между указанием класса и интерфейса есть: указывая имя класса, ты требуешь, что бы передаваемый обьект был этого класса, или обьектом потомка этого класса, указывая интерфейс, ты требуешь, что бы переданный обьект реализовывал интерфейс (независимо от его иерархии)
     
  11. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Так вот это меня и удивило, что тут нет упоминание об интерфейсах...
    Спасибо за разъяснение, Олег.
     
  12. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Если запутный класс - значит уже для профессионалов. Да, блин, запутаный класс - это професионально, и фиг с тем, что 152 строки можно заменить красивой функцией из 15.
     
  13. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    А всё таки почему ошибка?Может в настройках php.ini :)
     
  14. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Greg1978
    В интерфейсе функция определяется так:
    public function addInstrument();
    А в классе, который якобы соответствует этому интерфейсу, она определяется уже так:
    public function addInstrument(Instrument $instrument)
    Разница заметна? Чего же вы от PHP хотите?
    Приведенный класс, кстати, типичный презерватив на ООП :/
     
  15. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    Он мне ошибку выдаёт(см.выше)- этот код.
     
  16. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Greg1978
    Ну так я и написал, в чем ошибка... что еще непонятно? :)
     
  17. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    :oops: :( Если можно носом ткните не вижу. :) Я только изучаю.
     
  18. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    Всё понял!Спасибо!Просто, я так понял, что как декларирование функции так и её описание должно быть с указанием в аргументах значения.В интерфейсе и в самом классе!?
    Как же тогда - это опечатка такая в книге или есть другие способы описания.
     
  19. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Ни то ни другое. Кривота рук, книгу написавших.
     
  20. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    Или переводивших :D
    Спасибо!
     
  21. Серег, любой обучающий упрощенный пример — это проблема ради проблемы.
     
  22. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    флоппик
    Я не спорю. Но тем не менее, люди сызмальства приучаются именно к таким примерам. А потом появляются сам знаешь какие системы на ООП. С точно такими же классами, делающими ничего, зато выглядящими зело красиво...
     
  23. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    +1
     
  24. yugene

    yugene Активный пользователь

    С нами с:
    1 апр 2009
    Сообщения:
    2
    Симпатии:
    0
    to dagdamor
    to Elkaz
    Почему бы вам тогда не написать свою книгу? или хотя бы статью, обучающую правильному написанию систем на ООП?
    Даже выложенный здесь небольшой грамотный - по вашему мнению - обучающий пример, думаю, был бы интересен и полезен.
    Или напишите конкретно, что именно плохо в примере, предложенном авторами книги "php5 для профессионалов".
    А пространные замечания - о том, что типа все плохо-плохо в этом коде (а как надо-то?????) - бессмысленны, по-моему.
     
  25. kostyl

    kostyl Guest

    Dagdamor
    флоппик
    Greg1978
    Я считаю эту книгу просто превосходной. И написано же там "для профессионалов", да есть там некоторые неточности в коде, но это примеры не для того чтобы их выполнять, а совсем для другого. Господин Greg1978 мое сугубо личное мнение - внимательнее читайте текст и попытайтесь полностью понять, что хотят донести до вас авторы, ибо вы с этой книгой далеко не уйдете. Многие примеры там расчитаны на то, что вы их и набирать не будете, а напишите свои по таким принципам.