Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wzorzec złożony
Forum PHP.pl > Forum > PHP > Object-oriented programming
Jarod
Przerabiam sobie wzorzec złożony i znowu mam parę pytań. Tym razem analizując kod, każdy krok zapisywałem na kartce żeby sobie to dobrze wyobrazić. Później postanowiłem przepisać kod i go odpalić. Poniżej zamieszczę kod (pochodzi z ksiązki "PHP5 zaawansowane programowanie" ze strony 94)
  1. <html>
  2. <body>
  3.  
  4. <?php
  5.  
  6. abstract class AbstractInstrument {
  7.  
  8. private $name;
  9. private $category;
  10. private $instruments = array();
  11.  
  12. public function add(AbstractInstrument $instrument) {
  13. array_push($this->instruments, $instrument);
  14. }
  15.  
  16. public function hasChildren() {
  17. return (bool)(count($this->instruments) > 0);
  18. }
  19.  
  20. public function getChild($i) {
  21. return $instruments[$i];
  22. }
  23.  
  24. public function getDescription() {
  25. echo '- jeden '. $this->getName();
  26. if ($this->hasChildren()) {
  27. echo ' złożony z:<br>';
  28.  
  29. foreach ($this->instruments as $instrument) {
  30. echo '<table cellspacing=5 border=0><tr><td>  </td><td>-';
  31. $instrument->getDescription();
  32. echo '</td></tr></table>';
  33. }
  34. }
  35. }
  36.  
  37. public function setName($name) {
  38. $this->name = $name;
  39. }
  40.  
  41. public function getName() {
  42. return $this->name;
  43. }
  44.  
  45. public function setCategory($category) {
  46. $this->category = $category;
  47. }
  48.  
  49. public function getCategory() {
  50. return $this->category;
  51. }
  52. }
  53.  
  54.  
  55. class Guitar extends AbstractInstrument {
  56. function __construct($name) {
  57. parent::setName($name);
  58. parent::setCategory('gitary');
  59. }
  60. }
  61.  
  62. class DrumSet extends AbstractInstrument {
  63. function __construct($name) {
  64. parent::setName($name);
  65. parent::setCategory('perkusje');
  66. }
  67. }
  68.  
  69. class SnareDrum extends AbstractInstrument {
  70. function __construct($name) {
  71. parent::setName($name);
  72. parent::setCategory('werble');
  73. }
  74. }
  75.  
  76. class BaseDrum extends AbstractInstrument {
  77. function __construct($name) {
  78. parent::setName($name);
  79. parent::setCategory('bębny');
  80. }
  81. }
  82.  
  83. class Cymbal extends AbstractInstrument {
  84. function __construct($name) {
  85. parent::setName($name);
  86. parent::setCategory('talerze');
  87. }
  88. }
  89.  
  90.  
  91.  $drums = new DrumSet('Zestaw tama maple');
  92.  $drums->add(new SnareDrum('Werbel')); 
  93.  $drums->add(new BaseDrum('Duży bęben'));
  94.  
  95.  $cymbals = new Cymbal('Zestaw talerzy zildian');
  96.  $cymbals->add(new Cymbal('Mały talerz'));
  97.  $cymbals->add(new Cymbal('Duży talerz'));
  98.  
  99.  $drums->add($cymbals);
  100.  
  101.  $guitar = new Guitar('Gibson les paul');
  102.  
  103.  echo 'Lista instrumentów: <p>';
  104.  $drums->getDescription();
  105.  $cymbals->getDescription();
  106.  $guitar->getDescription();
  107.  
  108. ?>
  109. </body>
  110. </html>


A teraz bardzo Was proszę o przeanalizowanie go ze mną, bo nie wiem czy dobrze łapie.
  1. <?php
  2. 1.  $drums = new DrumSet('Zestaw tama maple');
  3. 2.  $drums->add(new SnareDrum('Werbel')); 
  4. 3.  $drums->add(new BaseDrum('Duży bęben'));
  5. ?>

Ad 1. Tworzymy instancję klasy DrumSet. Właściwość $name = 'Zestaw tama maple', $category = 'perkusje'
Ad 2. Do tablicy $instruments dodajemy instancję klasy SnareDrum
Ad 3. Do tablicy $instruments dodajemy instancję klasy BaseDrum

Czyli teraz wygląda to tak:

drums
$name - Zestaw tamla maple
$category - perkusje
$instruments - [ ($name - werbel, $category - werble), ($name - bęben, $category - bębny) ]



  1. <?php
  2. 1.  $cymbals = new Cymbal('Zestaw talerzy zildian');
  3. 2.  $cymbals->add(new Cymbal('Mały talerz'));
  4. 3.  $cymbals->add(new Cymbal('Duży talerz'));
  5.  
  6. 4.  $drums->add($cymbals);
  7. ?>

Ad 1. Tworzymy instancję klasy Cymbal. Właściwość $name = 'Zestaw talerzy zilidjian', $category='talerze'
Ad 2. Do tablicy $instruments dodajemy instancję klasy Cymbal
Ad 3. Do tablicy $instruments dodajemy instancję klasy Cymbal

cymbals
$name - Zestaw talerzy zilidjian
$category - talerze
$instruments - [ ($name - Maly talerz, $category - talerze), ($name - Duży talerz, $category - talerze) ]


Do tego miejsca rozumiem. Ale za cholere nie mogę pojąć Ad 4. Jak do tablicy $instruments, która przechowuje pary name-category mogę dodać obiekt, który dodatkowo przechowuje kolejną tablicę instruments?
goffyy
To jest dosc proste. Cala ta klasa wyglada jak tablica zlozona z obiektow typu AbstractInstrument.
A wiec jesli chodzi o to co napisales to wszystko sie zgadza. Jesli chodzi dlaczego to polecenie dziala:

  1. <?php
  2. $drums->add($cymbals);
  3. ?>


to zauwaz ze to co pisales wczesniej:

  1. <?php
  2. $cymbals->add(new Cymbal('Duży talerz'));
  3. ?>


mozna zapisac nastepujacy:

  1. <?php
  2. $duzy_talerz=new Cymbal('Duży talerz');
  3. $cymbals->add($duzy_talerz);
  4. ?>


Zauwaz ze metoda add przyjmuje zawsze element typu AbstractInstrument, czyli obiekt. Zapis w jednej linijce jest poprostu uproszczony i latwiej widac co sie dodaje. A teraz wracajac do dalszej czesci kodu:

  1. <?php
  2. $drums->add($cymbals);
  3. ?>


W tej linijce laczysz jakby dwie tablice. Po polaczeniu wyjdzie Ci cos takiego:

$drums=[ ($name - werbel, $category - werble), ($name - bęben, $category - bębny), (Zestaw talerzy zildian, talerze) => [ ($name - Maly talerz, $category - talerze), ($name - Duży talerz, $category - talerze) ] ]

Nie wiem czy to dobrze zapisalem ale struktura wyglada nastepujaco (opisywana po nazwie):

*Zestaw tama maple
- werbel
- bęben
- Zestaw talerzy zildian
- Maly talerz
- Duzy talerz


Nie wiem czy umiem tlumaczyc ale jak chociaz cokolwiek zrozumiales to juz bede szczesliwy smile.gif jak czegos nadal nie wiesz to pytaj smile.gif
Jarod
Cytat(goffyy @ 24.08.2006, 22:32 ) *
To jest dosc proste. Cala ta klasa wyglada jak tablica zlozona z obiektow typu AbstractInstrument.
A wiec jesli chodzi o to co napisales to wszystko sie zgadza. Jesli chodzi dlaczego to polecenie dziala:

  1. <?php
  2. $drums->add($cymbals);
  3. ?>


to zauwaz ze to co pisales wczesniej:

  1. <?php
  2. $cymbals->add(new Cymbal('Duży talerz'));
  3. ?>


mozna zapisac nastepujacy:

  1. <?php
  2. $duzy_talerz=new Cymbal('Duży talerz');
  3. $cymbals->add($duzy_talerz);
  4. ?>


Zauwaz ze metoda add przyjmuje zawsze element typu AbstractInstrument, czyli obiekt. Zapis w jednej linijce jest poprostu uproszczony i latwiej widac co sie dodaje. A teraz wracajac do dalszej czesci kodu:

  1. <?php
  2. $drums->add($cymbals);
  3. ?>


W tej linijce laczysz jakby dwie tablice. Po polaczeniu wyjdzie Ci cos takiego:

$drums=[ ($name - werbel, $category - werble), ($name - bęben, $category - bębny), (Zestaw talerzy zildian, talerze) => [ ($name - Maly talerz, $category - talerze), ($name - Duży talerz, $category - talerze) ] ]

Nie wiem czy to dobrze zapisalem ale struktura wyglada nastepujaco (opisywana po nazwie):

*Zestaw tama maple
- werbel
- bęben
- Zestaw talerzy zildian
- Maly talerz
- Duzy talerz


Nie wiem czy umiem tlumaczyc ale jak chociaz cokolwiek zrozumiales to juz bede szczesliwy smile.gif jak czegos nadal nie wiesz to pytaj smile.gif



Doszedłem do tego wczoraj o 2 w nocy smile.gif Dzięki za odpowiedź. Ta książka jest strasznie zamotana. Osoba, która ją tłumaczyła nie miała bladego pojęcia co robi..
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.