Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Początki z OOP :F
margyw
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 26.02.2009

Ostrzeżenie: (0%)
-----


Witam,

miałem kilku letnią przerwę w php i teraz, kiedy znowu mnie wciągnęło, za żadne skarby nie potrafię ogarnąć obiektówki (IMG:http://forum.php.pl/style_emoticons/default/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ć (IMG:http://forum.php.pl/style_emoticons/default/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ę (IMG:http://forum.php.pl/style_emoticons/default/dry.gif)

Z góry dzięki, pozdrawiam.

Ten post edytował margyw 28.06.2009, 23:56:46
Go to the top of the page
+Quote Post
erix
post
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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? (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif)

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

A po co? (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif)

return" title="Zobacz w manualu PHP" target="_manual + funkcja, tyle. [;
Go to the top of the page
+Quote Post
margyw
post
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 26.02.2009

Ostrzeżenie: (0%)
-----


Mniej więcej tak? (IMG:http://forum.php.pl/style_emoticons/default/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. ?>


Ten post edytował margyw 29.06.2009, 00:25:50
Go to the top of the page
+Quote Post
alegorn
post
Post #4





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


bede sie czepiac. tyci (IMG:http://forum.php.pl/style_emoticons/default/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.

Ten post edytował alegorn 29.06.2009, 09:04:19
Go to the top of the page
+Quote Post
erix
post
Post #5





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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ą. (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
alegorn
post
Post #6





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


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ą. (IMG:http://forum.php.pl/style_emoticons/default/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..
Go to the top of the page
+Quote Post
erix
post
Post #7





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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.
Go to the top of the page
+Quote Post
alegorn
post
Post #8





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
erix
post
Post #9





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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? (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif)
Go to the top of the page
+Quote Post
alegorn
post
Post #10





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


:] no fakt, masz tutaj zupelna racje, (wywala Warning ) ale i tak bede uparty, bo nie uwazam ze w wczesniejszym rozwiazaniu '@' jest rozwiazaniem (IMG:http://forum.php.pl/style_emoticons/default/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.... (IMG:http://forum.php.pl/style_emoticons/default/aaevil.gif)
Go to the top of the page
+Quote Post
margyw
post
Post #11





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 26.02.2009

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/sciana.gif) .

Ten post edytował margyw 30.06.2009, 00:01:07
Go to the top of the page
+Quote Post
alegorn
post
Post #12





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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.
Go to the top of the page
+Quote Post
erix
post
Post #13





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
obiektywnie?

Chyba obiektowo, bo obiektywna może być co najwyżej opinia (IMG:http://forum.php.pl/style_emoticons/default/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ń.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 4.10.2025 - 12:46