Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Początki z OOP :F
Forum PHP.pl > Forum > PHP > Object-oriented programming
margyw
Witam,

miałem kilku letnią przerwę w php i teraz, kiedy znowu mnie wciągnęło, za żadne skarby nie potrafię ogarnąć obiektówki worriedsmiley.gif .

Chciałbym, żebyście sprawdzili tą klasę i w ogóle naprowadzili mnie na dobrą drogę, czy tak powinno się używać OOP. Jako że uczyłem się strukturalnie to teraz trudno mi się odzwyczaić sciana.gif . Jest to prosty kodzik, który ma wyświetlać plik, który mu zapodam. Pisałem to pod malutki homepage, więc użyłem go do wyświetlania podstron. A więc:

  1. <?php
  2. class Page
  3. {
  4.    private $file;
  5.    
  6.    
  7.    public function __construct($file)
  8.    {
  9.        $this->file = 'content/'.$file.'.txt';
  10.    }
  11.    
  12.  
  13.    private function loadPage()
  14.    {    
  15.        $content = file($this->file);
  16.        $content = join('', $content);
  17.        
  18.        return $content;        
  19.    }
  20.    
  21.    
  22.    private function checkPage()
  23.    {
  24.        if(file_exists($this->file)) { return TRUE; } else { return FALSE; }    
  25.    }
  26.    
  27.    
  28.    public function viewPage()
  29.    {    
  30.        if($this->checkPage()==TRUE)
  31.        {
  32.            echo $this->loadPage();            
  33.        }else{    
  34.            echo '<h2>The page you have entered is incorrect!</h2>';    
  35.        }    
  36.    }
  37.    
  38. }
  39. ?>


  1. <?php
  2. if(isset($_GET['go']))
  3.    {                        
  4.        $page = new Page($_GET['go']);
  5.        $page->viewPage();                            
  6.    }else{                        
  7.        $page = new Page('main');
  8.        $page->viewPage();                        
  9.    }
  10. ?>


Tak więc, jest to poprawne użycie obiektówki, czy taki kod mija się z celem? Bo ja już sam nie wiem, może kiedyś to pojmę dry.gif

Z góry dzięki, pozdrawiam.
erix
Sama idea w miarę ok.

ALE:
  1. <?php
  2. $content = file($this->file);
  3.       $content = join('', $content);
  4.      
  5.       return $content;
  6. ?>

A file_get_contents" title="Zobacz w manualu PHP" target="_manual? snitch.gif

  1. <?php
  2. if(file_exists($this->file)) { return TRUE; } else { return FALSE; }
  3. ?>

A po co? snitch.gif

return" title="Zobacz w manualu PHP" target="_manual + funkcja, tyle. [;
margyw
Mniej więcej tak? rolleyes.gif

  1. <?php
  2. class Page
  3. {
  4.    private $file;
  5.    
  6.    
  7.    public function __construct($file)
  8.    {
  9.        $this->file = 'content/'.$file.'.txt';
  10.    }
  11.    
  12.  
  13.    private function loadPage()
  14.    {    
  15.        $content = @file_get_contents($this->file);
  16.        
  17.        return $content;        
  18.    }
  19.    
  20.    
  21.    public function viewPage()
  22.    {    
  23.        if($this->loadPage()==TRUE)
  24.        {
  25.            echo $this->loadPage();
  26.            
  27.        }else{
  28.            
  29.            echo '<h2>The page you have entered is incorrect!</h2>';
  30.            
  31.        }    
  32.    }
  33.    
  34. }
  35. ?>
alegorn
bede sie czepiac. tyci winksmiley.jpg


  1. <?php
  2. class Page
  3. {
  4.    private $file;
  5.    protected $content;
  6.    
  7.    public function __construct($file)
  8.    {
  9.        $this->file = 'content/'.$file.'.txt';
  10.        if ( !( $this->content = file_get_contents($this->file)) ){
  11.            throw new Exception('The page you have entered is incorrect!');
  12.        }
  13.    }
  14.    
  15.  
  16.    private function getContent()
  17.    {    
  18.        return $this->content;        
  19.    }
  20.    
  21.    
  22.    public function viewPage()
  23.    {    
  24.            echo $this->getContent();
  25.    }
  26.    
  27. }
  28. ?>



ja bym zrobil te klase jak wyzej....

w twoim przykladzie jest taka linijka... :
  1. <?php
  2. if($this->loadPage()==TRUE)
  3. ?>


wytlumacz mi jak ma to zadzialac, skoro loadPage, w twoim przykladzie zrwaca string? to pierwsza uwaga.
2. staraj sie nie uzywac @, skoro bierzesz pod uwage error - oprogramuj go.
3. skoro w konstruktorze na sztywno ustawiasz konkretny plik, to po co leniwie zaczytujesz jego tresc... ? na upartego da sie, ale mam spore wawtpliwosci, wobec takiego rozwiazania.
erix
Cytat
wytlumacz mi jak ma to zadzialac, skoro loadPage, w twoim przykladzie zrwaca string?

A no tak, że nie czytałeś dokumentacji
  1. <?php
  2. (bool)'Twoja stara';
  3. ?>

i odrób pracę domową. tongue.gif
alegorn
Cytat(erix @ 29.06.2009, 11:48:14 ) *
A no tak, że nie czytałeś dokumentacji
  1. <?php
  2. (bool)'Twoja stara';
  3. ?>

i odrób pracę domową. tongue.gif


praca domowa odrobiona... bardziej chodzi o zle doswiadczenia z takim slabym porownaniem...

po pierwsze nie kontrolujesz gdzie wystepuje blad. a i o takiej konwersji mozna by wiele gadac,
bo o ile:

var_dump((bool) "false"); // bool(true)
tak już:
var_dump((bool) "0"); // bool(false)


o ile mozna by sie zastanawiac nad przydatnoscia ponizszego dla tej klasy::
var_dump((bool) ""); // bool(false)
tak var_dump((bool) "0"); // bool(false) moze wygenerowac blizej nie zidentyfikowany blad..

przy wczesniejszych zalozeniach kazde prawidlowe zrodlo tresci, (w tym przypadku plik, ale to nie istotne) nie moze byc pusty lub... nie moze zawierac tylko '0', kiepskie, jak dla mnie przynajmniej..
erix
No tak, ale popatrz, że w kontekście tego skryptu jest to sprawdzenie, czy plik istnieje po najmniejszej linii oporu.

Umożliwia sprawdzenie, czy występują faktycznie jakieś dane, bo ani pusty plik, ani zero jako zawartość nie będą przydatne.

Nie pochwalam czegoś takiego, bo jest file_exists" title="Zobacz w manualu PHP" target="_manual, ale jeśli chodzi o logikę działania - rozwiązanie prawidłowe.
alegorn
owszem masz w pewnym sensie racje, ale ja nadal twierdze ze to rozwiazanie generuje blizej nie zidentyfikowane bledy, i jako takie jest zlym rozwiazaniem...

to czy plik istnieje - zwraca nam przeciez file_get_contents... jesli nie znajdziemy pliku, zwraca false wiec dalsze sprawdzanie tresci jest dyskusjne.. bo w takim razie nalezalo by wyciac biale znaki, pojednyncze znaki, etc.

zdecydowanie ta funkcja nie dziala zgodnie z oczekiwaniami, wiec dziala nie prawidlowo :]

jasne ze to tylko przyklad, szkic, ale tym bardziej nie jest polecane szkicowac funkcje ktora dziala nie do konca z zalozeniami, a przeciez zalozeniem jest wyswietlenie tresci pliku, nie istotne jaka ona jest.
erix
Cytat
jesli nie znajdziemy pliku, zwraca false wiec dalsze sprawdzanie tresci jest dyskusjne.. bo w takim razie nalezalo by wyciac biale znaki, pojednyncze znaki, etc.

I przy okazji sypiąc notice. A przecież wszystkim chyba zależy, aby dążyć do kodu sprawnie działającym nawet na raportowaniu E_STRICT? snitch.gif
alegorn
:] no fakt, masz tutaj zupelna racje, (wywala Warning ) ale i tak bede uparty, bo nie uwazam ze w wczesniejszym rozwiazaniu '@' jest rozwiazaniem biggrin.gif...
oczywiscie ze trzeba uzyc file_exists" title="Zobacz w manualu PHP" target="_manual o czym napisales wczesniej.

oba rozwiazania sa raczej szkicem, ale i tak uwazam ze moje po uszczelnieniu bedzie dzialac zgodnie z zalozeniami - a to wczesniejsze - tak nie do konca. :] choc to juz po trosze rozwazania teoretyczne, w praktyce, przy wyswietlaniu pelniejszej tresci - tez bedzie dzialac.

noo... ale skoro mielismy wskazywac te dobre rozwiazania.... aaevil.gif
margyw
Jeszcze mnie nurtuje pewna rzecz, a mianowicie podstrony.

Czy sposób, który pokazałem wyżej, tzn.

  1. <?php
  2. if(isset($_GET['go']))
  3.    {                        
  4.        $page = new Page($_GET['go']);
  5.        $page->viewPage();                            
  6.    }else{                        
  7.        $page = new Page('main');
  8.        $page->viewPage();                        
  9.    }
  10. ?>


jest poprawny, czy istnieje jakaś inna forma, którą wykorzystujecie pisząc obiektywnie?

Przypuśćmy, że robiłbym PA, i np. miałbym klasę z funkcjami:

  1. <?php
  2. class Admin()
  3. {
  4.  
  5.   public function add()
  6.      {
  7.           ...........
  8.      }
  9.  
  10.   public function del()
  11.      {
  12.           ............
  13.      }
  14.  
  15. }
  16. ?>


to wtedy poprawne, według zasad obiektowości, będzie wykorzystanie jej jak w w/w przykładzie?:

  1. <?php
  2. if(isset($_GET['co']))
  3.    if($_GET['co']=='add')
  4.        {
  5.            $art = new Admin();
  6.            $art->add();
  7.        }elseif($_GET['co']=='del'){
  8.            $art = new Admin();
  9.            $art->del();
  10.        }
  11.        ....................
  12. }
  13. ?>


Nie zwracajcie zbytnio uwagi na kod, można by również wykorzystać switch'a, ale nie o to chodzi, tylko o sam fakt, czy tak jest poprawnie wg, zasad OOP.

W ogóle przepraszam za tak banalne pytania, ale jakoś zagadnienie OOP nie może do mnie trafić i nie potrafię tego pogodzić z tym co już umiem.

Wydaje mi się, że za dużo strukturalności wtrącam w kod i dlatego przestaje to być stricte obiektowym kodem. Nie wiem już sam sciana.gif .
alegorn
mniej wiecej.

w zasadzie, programowanie obiektowe daje rezultaty przy wiekszych projektach, przy malych skryptach, tak naprawde jest to zabawa pro forma.
choc jest oczywiscie dobra wprawka.. zabawa zaczyna sie dopiero jak robisz interfejsy, abstrakty, itp smile.gif
ale lekko korygujac :

  1. <?php
  2. class Admin()
  3. {
  4.  private static $_instance;
  5.  //robimy singletona:)
  6.  public function instance(){...........}
  7.  public function add(){...........}
  8.  public function del(){ ............}
  9.  
  10. }
  11. ?>



i teraz uzycie
  1. <?php
  2. // nie zostawiaj nic przypadkowi
  3. $co = (isset($_GET['co'])&&!empty($_GET['co']))?$_GET['co']:null;
  4.  
  5. if(!empty($co))
  6.   if($co=='add')
  7.           $art->instance()->add();
  8.       elseif($co=='del')
  9.           $art->instance()->del();
  10.      
  11.       ....................
  12. ?>


aa, switch jest rzeczywiscie lepszy, w sensie znacznie wydajniejszy, pozwala sporo czasu zaoszczedzic.
erix
Cytat
obiektywnie?

Chyba obiektowo, bo obiektywna może być co najwyżej opinia tongue.gif

Cytat
W ogóle przepraszam za tak banalne pytania, ale jakoś zagadnienie OOP nie może do mnie trafić i nie potrafię tego pogodzić z tym co już umiem.

A czemu nie możesz utworzyć nowej instancji strony w stronie? Czyli podzielić na bloki, coś w ten deseń.
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.