Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Początki z OOP
Forum PHP.pl > Forum > PHP > Object-oriented programming
Wicepsik
Witam,
Zaczynam pisać w OOP, pomaga mi w tym kolega doradzając conieco. Chciałbym byście pomogli mi w pisaniu lepszego kodu. Przestawię wam moje wypociny.


  1. <?php
  2. class pogoda{
  3.  
  4.    public $web;
  5.    public $cities;
  6.    public $temp;
  7.    public $hpa;
  8.    
  9.    public function __construct($city){
  10. /*
  11. Wpisane wszystkie miasta które są dostępne w polsce
  12. */
  13.     $this->cities = array('Aleksandrów Kujawski' => 11642, 'Augustów' => 11643, 'Bartoszyce' => 11644, 'Bełchatów' => 11646, 'Będzin' => 11645, 'Biała Podlaska' => 11647, 'Białka Tatrzańska' => 11648, 'Białobrzegi' => 11649, 'Białogard' => 11650, 'Białystok' => 11651, 'Bielice' => 11652, 'Bielsk Podlaski' => 11653, 'Bielsko-Biała' => 11654);
  14.  
  15.    
  16.    
  17.        if(array_key_exists($city, $this->cities)){
  18.            $this->web = file_get_contents('http://pogoda.interia.pl/miasta?id='.$this->cities[$city]);
  19.            preg_match_all('/<b>([0-9]+)</b>/<span class="tex2B"  style="font-size:14px;">([0-9]+)</span>/<span class="tex3B">([0-9]+)</span>/', $this->web, $this->temp);
  20.            preg_match_all('/<b>([0-9]+)</b> hPa/', $this->web, $this->hpa);
  21.        }else{
  22.            echo 'Brak miasta!';
  23.        }
  24.        
  25.    }
  26.    
  27.    public function show_cities(){
  28.            $text = '<select>';
  29.        foreach($this->cities as $key => $value){
  30.            $text .= '<option value="'.$value.'">'.$key.'</option>';
  31.        }
  32.            $text .= '</select>';
  33.            
  34.        return $text;
  35.    }
  36.    
  37.    public function today_temp($mi = 0){
  38.              if($mi = 0){
  39.                  $text = $this->temp[1][0];
  40.              }else{
  41.                $text = $this->temp[3][0];
  42.              }
  43.         return $text;
  44.    }
  45.    
  46.    public function temp($mi = 0, $li = 0, $day = 0){
  47.              
  48.            $on = ($mi == 0) ? 1 : 3;
  49.            
  50.            switch($day){
  51.                case 0: if($li == 0) $of = 2; elseif($li == 1) $of = 3; else($li == 2) $of = 4; // przed południem, po południu, wieczorem
  52.                          break;
  53.                case 1: if($li == 0) $of = 5; elseif($li == 1) $of = 6; elseif($li == 2) $of = 7; else $of = 8; // nad ranem, przed południem, po południu, wieczorem
  54.                          break;
  55.                case 2: if($li == 0) $of = 9; elseif($li == 1) $of = 10; elseif($li == 2) $of = 11;  else $of = 12; // nad ranem, przed południem, po południu, wieczorem
  56.                          break;
  57.                case 3: $of = ($li == 0) ? 13 : 14;  // dzien, noc
  58.                          break;
  59.                case 4: $of = ($li == 0) ? 15 : 16;   // dzien, noc
  60.                          break;
  61.                case 5: $of = ($li == 0) ? 17 : 18;   // dzien, noc
  62.                          break;
  63.            }
  64.            
  65.         return $this->temp[$on][$of];
  66.    }
  67.    
  68.    public function hPa($mi = 0){
  69.    
  70.        return $this->hpa[1][$mi];
  71.    
  72.    }
  73.    
  74.    
  75.    public function __destruct() {
  76.        unset($this);
  77.    }
  78.    
  79.    
  80.    
  81.    
  82. }
  83.  
  84.  
  85.    $obiekt = new pogoda('Warszawa');
  86.    $obiekt->show_cities();
  87.    echo $obiekt->temp(1,1,1);
  88.    echo $obiekt->hPa(2);
  89. ?>
Fifi209
  1. <?php
  2. $obiekt->show_cities();
  3. ?>

raczej
  1. <?php
  2. echo  $obiekt->show_cities();
  3. ?>


Ale i tak widzę poprawiłeś dużo, o czym mówiłem. ;d

Dziwna jest ta funkcja temp() haha.gif
Pawel_W
  1. <?php
  2. case 0: if($li == 0) $of = 2; elseif($li == 1) $of = 3; else($li == 2) $of = 4; // przed południem, po południu, wieczorem
  3.                         break;
  4.               case 1: if($li == 0) $of = 5; elseif($li == 1) $of = 6; elseif($li == 2) $of = 7; else $of = 8; // nad ranem, przed południem, po południu, wieczorem
  5.                         break;
  6.               case 2: if($li == 0) $of = 9; elseif($li == 1) $of = 10; elseif($li == 2) $of = 11;  else $of = 12; // nad ranem, przed południem, po południu, wieczorem
  7. ?>


w każdym case $of jest proporcjonalna do $li, zamień to na
  1. <?php
  2. case 0: $of = $li+2;                         break;
  3.               case 1: $of = $li+5                         break;
  4.               case 2: $of = $li+9
  5. ?>


i będzie krócej tak jak chciałeś ;]
Fifi209
Krócej to byłoby zdefiniować stałe w klasie np.

rano, poludnie, wieczor

nadać im wartości i używać w switchu po prostu stałych i tak samo przy wywołaniu metody. haha.gif
erix
  1. <?php
  2. public function __construct($city){
  3. /*
  4. Wpisane wszystkie miasta które są dostępne w polsce
  5. */
  6.    $this->cities = array('Aleksandrów Kujawski' => 11642, 'Augustów' => 11643, 'Bartoszyce' => 11644, 'Bełchatów' => 11646, 'Będzin' => 11645, 'Biała Podlaska' => 11647, 'Białka Tatrzańska' => 11648, 'Białobrzegi' => 11649, 'Białogard' => 11650, 'Białystok' => 11651, 'Bielice' => 11652, 'Bielsk Podlaski' => 11653, 'Bielsko-Biała' => 11654);
  7. ?>

Przecież te zmienne możesz zadeklarować bezpośrednio przy definicji zmiennej, po co w konstruktorze?

  1. <?php
  2. public function show_cities(){
  3.           $text = '<select>';
  4.       foreach($this->cities as $key => $value){
  5.           $text .= '<option value="'.$value.'">'.$key.'</option>';
  6.       }
  7.           $text .= '</select>';
  8.          
  9.       return $text;
  10.   }
  11. ?>

A czemu mieszasz logikę z wyglądem? MVC!

  1. <?php
  2. public function temp($mi = 0, $li = 0, $day = 0){
  3.            
  4.           $on = ($mi == 0) ? 1 : 3;
  5. ?>

No ok, ale co mają powiedzieć te zmienne? MI/LI? Coś z listą wyliczeniową? Będziesz w stanie zrozumieć to za miesiąc, gdy "odpoczniesz" od kodu? PS. Zainteresuj się składnią phpDoc.

  1. <?php
  2. public function __destruct() {
  3.       unset($this);
  4.   }
  5. ?>

A to już totalny bezsens. tongue.gif
Fifi209
Cytat(erix @ 19.07.2009, 22:29:34 ) *
  1. <?php
  2. public function __construct($city){
  3. /*
  4. Wpisane wszystkie miasta które są dostępne w polsce
  5. */
  6.    $this->cities = array('Aleksandrów Kujawski' => 11642, 'Augustów' => 11643, 'Bartoszyce' => 11644, 'Bełchatów' => 11646, 'Będzin' => 11645, 'Biała Podlaska' => 11647, 'Białka Tatrzańska' => 11648, 'Białobrzegi' => 11649, 'Białogard' => 11650, 'Białystok' => 11651, 'Bielice' => 11652, 'Bielsk Podlaski' => 11653, 'Bielsko-Biała' => 11654);
  7. ?>

Przecież te zmienne możesz zadeklarować bezpośrednio przy definicji zmiennej, po co w konstruktorze?

Można tak, można tak - kwestia przyzwyczajenia, jednak wersja z konstruktorem wydaje się być lepsza. ;d

Cytat(erix @ 19.07.2009, 22:29:34 ) *
  1. <?php
  2. public function show_cities(){
  3.           $text = '<select>';
  4.       foreach($this->cities as $key => $value){
  5.           $text .= '<option value="'.$value.'">'.$key.'</option>';
  6.       }
  7.           $text .= '</select>';
  8.          
  9.       return $text;
  10.   }
  11. ?>

A czemu mieszasz logikę z wyglądem? MVC!

Wcześniej były echa, ja mu doradziłem aby zmienił na return.

Cytat(erix @ 19.07.2009, 22:29:34 ) *
  1. <?php
  2. public function temp($mi = 0, $li = 0, $day = 0){
  3.            
  4.           $on = ($mi == 0) ? 1 : 3;
  5. ?>

No ok, ale co mają powiedzieć te zmienne? MI/LI? Coś z listą wyliczeniową? Będziesz w stanie zrozumieć to za miesiąc, gdy "odpoczniesz" od kodu? PS. Zainteresuj się składnią phpDoc.

Zgadzam się. winksmiley.jpg

Cytat(erix @ 19.07.2009, 22:29:34 ) *
  1. <?php
  2. public function __destruct() {
  3.       unset($this);
  4.   }
  5. ?>

A to już totalny bezsens. tongue.gif

Zwolnienie pamięci uważasz za bezsens? Gdyby to był większy system, też byłby to bezsens? biggrin.gif
To tak jak np. z zamykaniem połączenia mysql, jak nie użyjesz mysql_close() skrypt i tak będzie działał.
erix
Cytat
jednak wersja z konstruktorem wydaje się być lepsza. ;d

Śmiem się sprzeczać. Niby pod jakim względem lepsza? Potrafisz uzasadnić? Masz jakieś argumenty?

Cytat
Wcześniej były echa, ja mu doradziłem aby zmienił na return.

To nie jest na to miejsce. Widok/helper - owszem. Ale nie logika.

Cytat
Zwolnienie pamięci uważasz za bezsens? Gdyby to był większy system, też byłby to bezsens?

Eee, to jest inna sprawa. Zwalnianie zasobów SQL, to co innego. Poza tym, skrypt przy końcu robi to sam.

Poczytaj, kiedy jest wyzwalany destruktor, to wtedy porozmawiamy, czy jest sens korzystania z unset" title="Zobacz w manualu PHP" target="_manual na $this. [;
Fifi209
Cytat(erix @ 19.07.2009, 22:42:46 ) *
Śmiem się sprzeczać. Niby pod jakim względem lepsza? Potrafisz uzasadnić? Masz jakieś argumenty?

Jeżeli najdzie mnie myśl pobierania z konstruktora jakiegoś parametru to tylko w konstruktorze podmienię, nie muszę grzebać w reszcie kodu. ;p
Z resztą zazwyczaj ludzie tak piszą, że w klasie tylko definiują zmienne a w konstruktorze nadają im domyślne wartości.

Cytat(erix @ 19.07.2009, 22:42:46 ) *
Poczytaj, kiedy jest wyzwalany destruktor, to wtedy porozmawiamy, czy jest sens korzystania z unset" title="Zobacz w manualu PHP" target="_manual na $this. [;


Podczas niszczenia obiektu. A czy to taki duży błąd...? smile.gif Nie, ale fakt mogłoby go nie być.
erix
Cytat
Z resztą zazwyczaj ludzie tak piszą, że w klasie tylko definiują zmienne a w konstruktorze nadają im domyślne wartości.

Zależy. Naprawdę zależy. Ale skoro to jest statyczna tablica, to dlaczego przy definiowaniu typów zmiennych nie wrzucasz wszystkich do jednego worka (np. dajesz null, null, null) i im typ przypisujesz dopiero w konstruktorze? A co by było, gdybyś chciał przerobić klasę na statyczną? Wtedy masz więcej roboty. tongue.gif

Cytat
Podczas niszczenia obiektu. A czy to taki duży błąd...? Nie, ale fakt mogłoby go nie być.

BUZI -> http://pl.wikipedia.org/BUZI
Fifi209
Cytat(erix @ 19.07.2009, 23:21:26 ) *
Zależy. Naprawdę zależy. Ale skoro to jest statyczna tablica, to dlaczego przy definiowaniu typów zmiennych nie wrzucasz wszystkich do jednego worka (np. dajesz null, null, null) i im typ przypisujesz dopiero w konstruktorze? A co by było, gdybyś chciał przerobić klasę na statyczną? Wtedy masz więcej roboty. tongue.gif

Po prostu wszystko zależy od przeznaczenia klasy. winksmiley.jpg

Cytat(erix @ 19.07.2009, 23:21:26 ) *

Hahaha, spodobało mi się. Poprawiłeś mi humor.
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.