Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] OOP
Forum PHP.pl > Forum > Przedszkole
kosmos
Witam

Już kiedyś pisałem że chciałem się wdrożyć w programowanie obiektowe w PHP smile.gif

Napisałem cosbie taki oto kod składający się z 3 klas:

  1. <?php
  2.  
  3. class Car{
  4.  protected $mark,$color,$mileage;
  5.  
  6.  protected function __construct($mark,$color,$milleage){
  7.  $this->mark=$mark;
  8. $this->color=$color;
  9. $this->mileage=$milleage;
  10.  }
  11.  
  12.  protected function getMark(){
  13.  return $this->mark;
  14. }
  15.  
  16.  protected function getColor(){
  17.  return $this->color;
  18. }
  19.  
  20.  protected function getMileage(){
  21.  return $this->mileage;
  22.  }
  23.  
  24.  private function getAllPropertiesOfCar(){
  25.  return $this->getMark().' '.$this->getColor().' '.$this->getMileage();
  26.  }
  27.  
  28.  }
  29.  
  30.  
  31. class Person extends Car{
  32.  protected $name,$surname,$age,$profession,$auto;
  33.  
  34.  protected function setName($name){
  35.  $this->name=$name;
  36.  }
  37.  
  38.  protected function setSurname($surname){
  39.  $this->surname=$surname;
  40. }
  41.  
  42.  protected function setAgeAndProfession($age,$profession){
  43.  $this->age=$age; $this->profession=$profession;
  44.  }
  45.  
  46.  protected function giveAllPropertiesOfPerson(){
  47.  print $this->name.' '.$this->surname.' '.$this->age.' '.$this->profession.'<br><br>';
  48.  
  49.  }
  50.  
  51.  
  52.  public  function chooseYourCar($mark,$color,$milleage){
  53.  $this->mark=$mark;
  54.  $this->color=$color;
  55.  $this->mileage=$milleage;
  56.  }
  57.  
  58.  
  59.  
  60.  
  61. public  function showNewCar(){
  62.  print $this->name. ' bought a new car. It`s: '.$this->getMark().' the color is: '.$this->getColor().' and the milleage is not to bad: '.$this->getMileage();
  63.  }
  64.  
  65.  }
  66.  
  67.  
  68.  
  69.  class Family extends Person{
  70.  private $address,$fortune,$volume;
  71.  
  72.  function __construct($address,$fortune,$volume){
  73.  
  74. $this->address=$address;
  75.  $this->fortune=$fortune;
  76.  $this->volume=$volume;
  77.  }
  78.  
  79.  
  80.  public function addPerson($name,$surname,$age,$profession){
  81.  $this->setName($name);
  82. $this->setSurname($surname);
  83. $this->setAgeAndProfession($age,$profession);
  84. }
  85.  
  86.  
  87.  public function printFamily(){
  88. $this->giveAllPropertiesOfPerson();
  89. }
  90.  
  91.  public function printPropertiesOfFamilyCar(){
  92. $this->showNewCar();
  93. }
  94.  
  95.  
  96.  public function hugePersonOfFamily(Person $p){
  97.  print'<br>';
  98.  return $this->name.' is hugging '. $p->name;
  99.  }
  100.  
  101.  };
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  // CIAŁO
  112.  
  113.  $family= new Family('London',240000,4);
  114.  $family->addPerson('John','Kowalski',46,'Programmer');
  115.  
  116.  $family_a=new Family('Krakow',120000,2);
  117.  $family_a->addPerson('Izabel','Kowlaska',44,'Designer');
  118.  
  119.  $family->printFamily();
  120.  $family_a->printFamily();
  121.  
  122.  $family->chooseYourCar('volvo','red' ,230000 );
  123.  $family->showNewCar();
  124.  print $family->hugePersonOfFamily($family_a);
  125.  
  126. ?>

Proszę znawców o zweryfikowanie czy dobrze rozumiem pojecie obiektowości. Zastosowałem oddzielne klasy dla obiektów, dodałem dla nich unikalne funkcje gdzie niekiedy inne obiekty korzystają z funkcji innych obiektów.

Proszę o opinie czy moje wypocinki można nazwać choź troszkę OOP questionmark.gif

EDIT:

oto wynik zwracany przez powyższy kod

Kod
John Kowalski 46 Programmer

Izabel Kowlaska 44 Designer

John bought a new car. It`s: volvo the color is: red and the milleage is not to bad: 230000
John is hugging Izabel
nospor
class Person extends Car
A od kiedy to osoba może być samochodem lub przejmować jego cechy? Osoba może mieć samochód.

Dziedziczenie służy do dziedziczenia podobnych cech dla podobnych obiektów. Przykład:
klasa figura
klasa trojkat dziedziczy po figura
klasa kwadrat dziedziczy po figura

klasa samochod
klasa samochodosobowy dziedziczy po samochod
klasa samochodciezarowy dziedziczy po samochod

klasa osoba nie dziedziczy po samochod.
Obiekt osoba może mieć samochód.


Podobnie z rodziną. Rodzina zawiera w sobie osoby. Rodzina nie jest osobą i po niej nie dziedziczy
kosmos
Dzięki za odpowiedź

1) W takim razie wszystko będzie poprawnie jeśli zrezygnuję z dziedziczenia klasy Car po Family i zmienię odpowiednio wywoływanie metod questionmark.gif

2) czy poza tym błędem jest jeszcze coś nie tak questionmark.gif

3) I odpowiedź na pytanie czy to już OOP czy nie smile.gif
nospor
ad1) mowilem o dwoch zlych dziedziczeniach smile.gif

ad2) Jak poprawisz tamto to pogadamy

ad3) Przy bledach co zrobiles to jeszcze to nie jest OOP
kosmos
Nie wiem czy dobrze zrozumiałem


  1. <?php
  2. class Family{
  3.  private $address,$fortune,$volume;
  4.  private $person; // <-- TERAZ MA W SOBIE OSOBY questionmark.gif
  5. ?>
nospor
private $person; // <-- TERAZ MA W SOBIE OSOBY questionmark.gif
Nie, teraz ma w sobie jedną osobe.
kosmos
Cytat(nospor @ 30.05.2008, 22:43:12 ) *
private $person; // <-- TERAZ MA W SOBIE OSOBY questionmark.gif
Nie, teraz ma w sobie jedną osobe.


Czyli rozumiem że trzeba tu zrobić kolekcję tych osób w postaci tablicy questionmark.gif

Czy o to chodziło questionmark.gif

  1. <?php
  2. class Family{
  3.  private $address,$fortune,$volume;
  4.  private $person,$name; // <-- TERAZ MA W SOBIE OSOBY questionmark.gif
  5.  
  6.  
  7.  function __construct($address,$fortune,$volume){
  8.  
  9. $this->address=$address;
  10.  $this->fortune=$fortune;
  11.  $this->volume=$volume;
  12.  }
  13.  
  14.  public function addPerson(){
  15.  
  16.  $this->person=array(
  17.  'name'=>$name);
  18.  
  19.  }
  20. ?>


pomóżcie bo naprawdę chce się nauczyć OOP sad.gif
nospor
  1. <?php
  2. class Family{
  3.  private $address,$fortune,$volume;
  4.  private $persons,$name; 
  5.  
  6.  
  7.  function __construct($address,$fortune,$volume){
  8.  
  9. $this->address=$address;
  10.  $this->fortune=$fortune;
  11.  $this->volume=$volume;
  12. $this->persons = array();
  13.  }
  14.  
  15.  public function addPerson($person){
  16.  
  17.  $this->persons[] = $person;
  18.  
  19.  }
  20. ?>


edit:
PRzeciez tym kodem:
  1. <?php
  2. public function addPerson(){
  3.  
  4.  $this->person=array(
  5.  'name'=>$name);
  6.  
  7.  }
  8. ?>

Za kazdym wywolaniem addPerson nadpisywalbys zmienna $person. Gdzie tu tablica osob? Pomijam już fakt, że $name to z kosmosu bierzesz.
Moze zamiast za OOP to weź się najpierw za podstawy php?
dr_bonzo
Ziomus, zacznij od zaimplementowania tego:

  1. <?php
  2. $family = new Family( 'Longon', 240000 );
  3. $john = new Person( 'John', 'Kowalski', 46 );
  4. $john->setOccupation( 'Programmer' ); // bo moze byc przeciez bezrobotny, nie?
  5. $bob = new Person( 'Bob', 'Kowalski', 10 );
  6. $family->addPerson( $john );
  7. $family->addPerson( $bob );
  8.  
  9. $family_a = new Family('Krakow',120000,2); 
  10. $iza = new Person( 'Izabela', 'Kowlaska', 44 );
  11. $iza->setOccupation( 'Designer' );
  12.  
  13.  
  14. $family->printFamily(); // jak chcesz mega wypasione OOP to "printera" mozesz do innej klasy przeniesc, ale tutaj powinna ta metodka wystarczyc
  15. // ma wypisac wsyzstkich czlonkow rodziny
  16. $family_a->printFamily();
  17.  
  18. $family->addCar( new Car( 'Volvo', 'red', 230000 ) );
  19. $family->printLatestCarInfo(); // moze korzystac wewnetrznie z $car->printInfo(); zalezy od potrzeb
  20.  
  21. // print $family->hugePersonOfFamily($family_a); - bez sensu - rodzina ma przytulac rodzine, a tak na prawde przytula 1 osobe?questionmark.gif? WTF
  22.  
  23. $john->giveHugTo( $iza ); // wystarczy?
  24. ?>


3 klasy, 0 dziedziczenia
kosmos
Witam ponownie

@dr_bonzo

napisałem to co poleciłeś poszło całkiem dobrze już chyba pomalutku zaczynam rozumieć OOP.


  1. <?php
  2.  
  3. class Family{
  4. private $city,$fortune,$volume;
  5. public $person;
  6. public $car;
  7.  
  8. function __construct($city,$fortune,$volume){
  9. $this->city=$city;
  10. $this->fortune=$fortune;
  11. $this->volume=$volume;
  12. $this->person=array();
  13. }
  14.  
  15. public function addPerson($person){
  16. $this->person[]=$person;
  17. }
  18.  
  19. public function addCar($car){
  20. $this->person[]=$car;
  21. }
  22.  
  23. public function printFamily(){
  24. /**  foreach($this->person as $key => $value)
  25. print $this->person[$key] -> name;
  26. print $this->person[$key] -> surname;
  27. print $this->person[$key] -> age;
  28. print $this->person[$key] -> occupation;
  29. print '<br>';
  30. print_r($this->person);
  31.  } NIESTETY NIE DZIAŁA POPRAWNIE :(*/
  32. for($int = 0; $int < count($this->person); $int++){
  33. print $this->person[$int]->name .'<br>';
  34. print $this->person[$int]->surname .'<br>' ;
  35. print $this->person[$int]->age .'<br>';
  36. print $this->person[$int]->occupation .'<br><br>';
  37. }
  38.  }
  39. };
  40.  
  41. class Person{
  42. public $name,$surname,$age;
  43. public $occupation;
  44.  
  45. function __construct($name,$surname,$age){
  46. $this->name=$name;
  47. $this->surname=$surname;
  48. $this->age=$age;
  49. }
  50.  
  51. public function setOccupation($occupation){
  52. $this->occupation=$occupation;
  53.  }
  54.  
  55. public function huge(Person $p){
  56. print $this->name.' is hugging '.$p->name;
  57. }
  58. };
  59.  
  60. class Car{
  61. private $mark,$color,$mileage;
  62.  
  63. public function __construct($mark,$color,$milleage){
  64.  $this->mark=$mark;
  65. $this->color=$color;
  66. $this->mileage=$milleage;
  67. }
  68.  
  69. public function printLatestCarInfo(){
  70. print $this->mark.' '.$this->color.' '.$this->mileage;
  71. }
  72. };
  73.  
  74. // CIAŁO
  75. $family= new Family('London','240000',2);
  76. $john= new Person('John','Kowalski',46);
  77. $john->setOccupation('Programmer');
  78. $bob= new Person('Bob','Kowalski',10);
  79. $family->addPerson($john);
  80. $family->addPerson($bob);
  81.  
  82. $family_a= new Family('Krakow','120000',1);
  83. $iza= new Person('Izabela','Nowak',44);
  84. $iza->setOccupation('Designer');
  85. $family_a->addPerson($iza);
  86.  
  87. $family->printFamily();
  88. print'Wydruk drugiej rodzinki';
  89. $family_a->printFamily();
  90.  
  91. $family->addCar($car=new Car('Volvo','red',230000));
  92. print'Wydruk samochodu rodzinki<br>';
  93. $car->printLatestCarInfo();
  94. print'<br>Ściskają się<br>';
  95. $john->huge($iza);
  96. ?>


WYNIK

Kod
John
Kowalski
46
Programmer

Bob
Kowalski
10


Wydruk  drugiej rodzinkiIzabela
Nowak
44
Designer

Wydruk samochodu  rodzinki
Volvo red 230000
Ściskają się
John is hugging Izabela


Może jakiś kolejny przykład smile.gif questionmark.gif


@ NOSPOR

Cytat(nospor @ 30.05.2008, 23:32:09 ) *
Pomijam już fakt, że $name to z kosmosu bierzesz.
Moze zamiast za OOP to weź się najpierw za podstawy php?



uznam to za złośliwość z Twojej strony ( wczoraj było dosyć późno ... nie każdy jest robokopem a każdy potrzenuje wypoczynku stąd być może moje błędy )
dr_bonzo
@kosmos: OOP to jest to co ja napisalem, reszta to implementacja smile.gif
I proboj pisac zaczynajac wlasnie od tej strony, a nie od razu od implementacji [nie mowie ze zawsze, ale czasem jest to lepsza droga,a juz na pewno do poznania oop].

edit: no i skoro ci kod dziala - to jest ok
kosmos
@dr_bonzo
Dzięki wielkie

w niedługim czasie postaram się napisać coś większego i swojego ( bardziej użytecznego ). Może wtedy wkleje tu kilka wierszy kodu do przeanalizowana smile.gif

Pozdrawiam
nospor
Cytat
uznam to za złośliwość z Twojej strony ( wczoraj było dosyć późno ... nie każdy jest robokopem a każdy potrzenuje wypoczynku stąd być może moje błędy )
Pokazujesz kod OOP i prosisz o ocene i wskazanie bledow. Dostales to odemnie. Dostales tez sugestie bys jednak zaczal od nauki podstaw bo z tym tez u Ciebie krucho. Jak chcesz to traktuj to sobie jako zlosliwosc. Wybacz, ale ja nie wiem czy ty gadasz ze mna na forum po nieprzespanej nocy, czy po trzech nieprzespanych nocach. Oddajesz cos pod ocene, znaczy ze chcesz oceny. Koniec kropka. Jak jestes zmeczony to sie przespij i napisz kod dnia nastepnego. Ludzie jak cos analizują Twojego to poswiecają na to swoj czas, wiec oddawaj cos co piszesz będąc w pelni swiadomym. Szanuj czas innych, ktorych prosisz o pomoc.

Widze ze dales pomogl dla dr_bonzo. Ok. Ale ja Ci nie pomogłem? Pokazałem ci na samym początku jakie robisz podstawowe błedy. dr_bonzo niejako to podsumował nie dodając nic więcej. Odnosze wrażenie, ze skoro napisalem bys sie za podstawy wziął to mnie w ten sposob karzesz :/ Dziwne postepowanie.
Nie zeby mi zalezalo na pomogl od Ciebie. Chce ci jedynie zwrocic uwage bys na przyszlosc troche inaczej postepowal. smile.gif

edit: dziękuję za Pomogł smile.gif
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.