Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Szybki przykład OPP?
Forum PHP.pl > Forum > PHP > Object-oriented programming
ed3k
Przedstawię Wam mój krótki kod formularza napisanego OPP. Form jest samo przetwarzający się, posiada też krótką walidację, odnośnie tego, czy wartości podane przez użytkownika są liczbami. Ten formularz ma tylko jeden cel: chcę się od Was dowiedzieć czy w ogóle zrozumiałem ideę OPP? Chciałbym wiedzieć, czy rozumiem sens tworzenia nowych obiektów i przeprowadzania na nich operacji. Bo nigdy nie wiem, czy operacje mam opisac poza class'a czy w jakies funkcji class'y?

  1. <?php
  2. class Form extends Walidate{
  3.  
  4.    public $arrInputs = array();
  5.  
  6.    public function __construct(){
  7.        if($this->checkPost()){
  8.            $this->walidatePosts();
  9.        }
  10.    }
  11.  
  12.    public function addInput($inputType, $name, $value, $inputText){
  13.        $input = ''.$inputText.'
  14. ';
  15.        array_push($this->arrInputs, $input);
  16.    }
  17.  
  18.    public function setForm($method = 'post', $action = ''){
  19.        $s = '';
  20.        $s .= '';
  21.        foreach($this->arrInputs as $value ){
  22.            $s .= &#092;"$value\n\";
  23.        }
  24.        $s .= '';
  25.        return $s;
  26.    }
  27. }
  28.  
  29. class Walidate{
  30.    public function checkPost(){
  31.        foreach($_POST as $value){
  32.            if(!$value)
  33.                return FALSE;
  34.        }
  35.        return TRUE;
  36.    }
  37.  
  38.    public function walidatePosts(){
  39.        foreach($_POST as $value){
  40.            if(!ereg('^[0-9] , $value))
  41.                die('Podane wartości nie są liczbami!');
  42.        }
  43.        $numbers = implode(', ', $_POST);
  44.        echo \"Podane wartośc: $numbers są liczbami.\";
  45.    }
  46. }
  47.  
  48. echo 'Proszę podać dwie wartości, które są liczbami.
  49. ';
  50. $showForm = new Form();
  51. $showForm->addInput('text', 'Tpierwszy', '', 'Pierwsza wartość');
  52. $showForm->addInput('text', 'Tdrugi', '', 'Druga wartość);
  53. echo $showForm->setForm();
  54. ?>
Cysiaczek
Cytat
class Form extends Walidate{

To nie ma żadnego sensu. Czy uważasz, że w prawdziwym świecie formularz podatkowy rozszerza panią Krysię z Urzędu Skarbowego, która go sprawdza?

Cytat
die('Podane wartości nie są liczbami!');
//i za chwilę
echo "Podane wartośc: $numbers są liczbami.";

Po co mi metoda w(v)alidate(), która nie pozwala mi zareagować na błąd tak, jak chcę?

Czy to jest zgodne z duchem OOP? Nie, OOP to sposób myślenia o obiektach i ich relacjach. Tego u Ciebie nie widać, masz kod stukturalny zamknięty w klasy. Sugestia - zainwestuj w literaturę papierową smile.gif

Pozdrawiam.
ed3k
Mam książkę "Biblia PHP5 i MySQL", czytam na bieżąco przykłady na forum. Czego mi tu brakuje aby się uwolnić o kodu strukturalnego?

Napisałem inny przykład, galerię. Pobiera ona informacje o zdjęciach z bazy danych i je przetwarza wyświetlając miniaturki zdjęć. Jest to początek przyszłej galerii. Może tu lepiej uchwyciłem tego ducha?

  1. <?php
  2. class GaleryIcons{
  3.    public $q; // MySQL query;
  4.    public $r; // result from MySQL query;
  5.    public $arrPhotos = array();
  6.  
  7.    public function __construct($host, $user, $pass, $db){
  8.        mysql_connect($host, $user, $pass) or die('Błąd przy połączeniu z bazą danych.');
  9.        mysql_select_db($db) or die('Błąd przy wyborze bazy danych.');
  10.    }
  11.  
  12.    public function addPhoto($photo){
  13.        array_push($this->arrPhotos, $photo);
  14.    }
  15.  
  16.    public function MySQLQuery($query){
  17.        $this->r = mysql_query($query) or die('Błąd przy zapytaniu MySQ: '.mysql_error());
  18.    }
  19.  
  20.    public function showIcons($arrPhotos){
  21.        $s = '';
  22.        foreach($arrPhotos as $value){
  23.            $s .= <<<kodHTML
  24.                     <div>
  25.                         <img src="obrazy/$value" width="120px" />
  26.                     </div>
  27. kodHTML;
  28.        }
  29.        return $s;
  30.    }
  31. }
  32.  
  33. $galeria = new GaleryIcons('localhost', 'root', 'zaq12wsx', 'galeria');
  34. $galeria->q = "SELECT zdjecie FROM oth_galeria ORDER BY zdjecie";
  35. $galeria->MySQLQuery($galeria->q);
  36. while($row = mysql_fetch_row($galeria->r)){
  37.    $galeria->addPhoto($row[0]);
  38. }
  39. echo $galeria->showIcons($galeria->arrPhotos);
  40. ?>
Sedziwoj
@ed3k
Zrób jedną rzecz, narysuj tego diagram w UML, a potem pomyśl czy tak powinien wyglądać.
LBO
Cytat(Cysiaczek @ 23.09.2008, 02:59:50 ) *
formularz podatkowy rozszerza panią Krysię z Urzędu Skarbowego, która go sprawdza?

Telefonistka dziedziczy po telefonie biggrin.gif:D:D:D:D
mecenas
partykularnie - OBIEKTOWO oznacza podejście do każdego elementu jak do OBIEKTU. Każdy OBIEKT ma swoje metody (funkcje).

Stworzenie nowego obiektu ma na celu wykreowanie pewnej określonej funkcjonalności jakiegoś abstrakcyjnego tworu programistycznego, czyli - przykładowo - zgrupowania pewnych wielkości w logiczną całość. Z grubsza można by uznać, że wiersz z tabeli w bazie danych jest obiektem (no i na upartego ma jakieś swoje metody w postaci zapytań winksmiley.jpg.

Co to daje w praktyce? Dzięki odpowiedniemu podejściu po stworzeniu klasy możemy swobodnie operować nowym, stworzonym przez nas typem, co pozwala na duże uproszczenie kodu, zwiększenie jego przejrzystości, jest także wygodne, bo w przypadku chęci wprowadzenia zmian w jakiejś funkcji dla danego typu (tudzież zmian w dociążonym/przeciążonym operatorze) sprawa sprowadza się do eleganckiej modyfikacji w ciele klasy smile.gif

wybaczcie bełkot 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.