Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]programowanie obiektowe (czy jest dobrze)
Forum PHP.pl > Forum > PHP
Lejto
Postanowiłem się w końcu zacząć uczyć programowania obiektowego. guitar.gif Na początek napisałem skrypt który graweruje formularze. Czy kod jest optymalny? Co w nim jest niepotrzebne a co zmienić?
  1. <?
  2. class mech_form
  3. {
  4.  
  5. function utworz($action, $nazwa, $metoda)
  6. {
  7. echo '<form action="'.$action.'" name="'.$nazwa.'" method="'.$metoda.'">';
  8. }
  9.  
  10. function utworzPoleInput($type, $size, $value)
  11. {
  12. $a = new tworzHTML();
  13. $a->PoleInput($type, $size, $value);
  14.  }
  15.  
  16. }
  17.  
  18. class tworzHTML extends mech_form 
  19. {
  20.  
  21. function PoleInput($type, $size, $value)
  22. {
  23. echo $nazwa.'<input type="'.$type.'" size="'.$size.'" value="'.$value.'">'; 
  24. }
  25.  
  26. }
  27.  
  28. $mech_form = new mech_form();
  29.  
  30.  
  31. ?><br />
  32. <?
  33. $formularz = $mech_form->utworz('formularz', 'Nazwa', 'post');
  34. ?>
  35. <table>
  36. <tr>
  37. <td>Nick: </td>
  38. <td><? $mech_form->utworzPoleInput('text', '3', 'ELO'); ?>
  39. </td>
  40. </tr>
  41. </table>
  42. </form>
dr_bonzo
W jakim celu
1. klasa tworzHTML rozszerza mech_form
2. istnieje klasa tworzHTML

pozatym: dla tak prostej funkcjonalnosci wystarcza funkcje, krocej sie pisze.
marcio
Kiedys jak tez sie chcialem uczyc OOP to tez napisalem cos takiego
  1. <?php
  2. class Html_code {
  3.  
  4. protected $action, $method, $name, $type, $value, $rows, $cols, $style, $html;
  5.  
  6. public function new_form($action, $method) {
  7.  
  8. return '<form method="'.$method.'" action="'.$action.'">';
  9. }
  10.  
  11. public function text_input($name, $type, $value = '', $style) {
  12.  
  13. return '<input type="'.$type.'" name="'.$name.'" value="'.$value.'" style="'.$style.'">';
  14. }
  15.  
  16. public function textarea($name, $value, $rows, $cols, $style) {
  17.  
  18. return '<textarea name="'.$name.'" cols="'.$cols.'" rows="'.$rows.'" style="'.$style.'">'.$value.'</textarea>';
  19. }
  20.  
  21. public function button($name, $type, $value, $style) {
  22.  
  23. return '<input type="'.$type.'" name="'.$name.'" value="'.$value.'" style="'.$style.'">';
  24. }
  25.  
  26. public function html($html) {
  27.  
  28. return $html;
  29. }
  30. };
  31. ?>

Moze ci sie przyda
phpion
Moim zdaniem tego typu metody lepiej deklarować jako statyczne. Jeśli chciałbyś sobie podejrzeć inne rozwiązania to możesz zobaczyć te, które są wbudowane we framework Kohana:
HTML
Form
Proste, a przy tym cholernie użyteczne i przydatne smile.gif
marcio
HEh @phpion te klasy sa o duzo wiecej rozbudowane i bardziej skomplikowane jak dla mnie ja wole cos mojego i latwego za pomoca tamtej klasy napisalem nawet ksiege gosci i dziala tongue.gif ogolnie OOP sie nie zajmuje ale dobrze wiedziec ze takie cos instnieje
Sedziwoj
Cytat(phpion @ 27.04.2008, 18:07:13 ) *
Moim zdaniem tego typu metody lepiej deklarować jako statyczne. Jeśli chciałbyś sobie podejrzeć inne rozwiązania to możesz zobaczyć te, które są wbudowane we framework Kohana:
HTML
Form
Proste, a przy tym cholernie użyteczne i przydatne smile.gif


Może i proste, ale nie przydatne, nawet warstwa widoku nie jest wydzielona. Do tego to kod proceduralny zamknięty w obiekcie.
Tak aby nie być gołosłownym, to mamy obiekt formularza, który ma pola, każde pole ma swój typ, nazwę, walidację...
To było by obiektowe, a nie takie coś.

EDIT literówka
Cysiaczek
Obiektowo chcecie? Proszę: http://www.plentyofcode.com/2008/04/7-days...symfony-11.html

Pozdrawiam
phpion
@Sedziwoj masz rację ale:
- kolega zaczyna zgłębiać OOP,
- średnio wyobrażam sobie wydzielenie warstwy widoku dla jednego inpucika winksmiley.jpg moim zdaniem przerost formy nad treścią.
Sedziwoj
Cytat(Cysiaczek @ 28.04.2008, 01:54:55 ) *

Na pewno przeczytam, ale nie teraz...

Cytat(phpion @ 28.04.2008, 07:00:15 ) *
@Sedziwoj masz rację ale:
- kolega zaczyna zgłębiać OOP,

Powiedz szczerze, czy brałeś to w ogóle pod uwagę, bo mi się wydaje że nie, więc nie pisz o tym innym, do tego to nie jest meritum sprawy.
Do tego piszesz o OOP, a nie o klasach, więc OOP to nie jedna klasa, ale to chyba wiesz.
Cytat
- średnio wyobrażam sobie wydzielenie warstwy widoku dla jednego inpucika winksmiley.jpg moim zdaniem przerost formy nad treścią.

Ech, no i właśnie tak powstaje syf w aplikacjach, "po co widok, przecież to tylko jedno echo". Nie chce mi się tłumaczyć dlaczego to jest dobre rozwiązanie, bo to jakby tłumaczyć dlaczego używać wzorca MVC (tudzież MVP).
Lejto
napisałem takie coś:
  1. <?php
  2. class mech_tabele
  3. {
  4.  
  5. function utworz_tabele($class, $align, $bordercolor, $border, $cellpadding, $cellspacing, $id)
  6. {
  7. echo '<table class="'.$class.'" align="'.$align.'" bordercolor="'.$bordercolor.'" border="'.$border.'"
  8.  cellpadding="'.$cellpadding.'" cellspacing="'.$cellspacing.'" id="'.$id.'">';
  9. }
  10. function utworz_wierssz()
  11. {
  12. echo '<tr>';
  13. }
  14. function utworz_kolumne($bgcolor,$tekst)
  15. {
  16. echo '<td bgcolor="'.$bgcolor.'"><b>'.$tekst.'</b>';
  17. }
  18. function zamknij_wiersz()
  19. {
  20. echo '</tr>';
  21. }
  22. function zamknij_kolumne()
  23. {
  24. echo '</td>';
  25. }
  26. function zamknij_wszytko()
  27. {
  28. echo '</td></tr></table>';
  29. }
  30. }
  31.  
  32.  
  33.  
  34.  
  35. $mech_tabele = new mech_tabele();
  36.  
  37. $mech_tabele->utworz_tabele('ucz', 'center', '#000000', '1', '1', '0', 'problem');
  38.  $mech_tabele->utworz_wierssz();
  39. $mech_tabele->utworz_kolumne('#FF3030', 'Problem:');
  40. $mech_tabele->zamknij_kolumne();
  41. $mech_tabele->zamknij_wiersz();
  42. $mech_tabele->utworz_wierssz();
  43. $mech_tabele->utworz_kolumne('#FF3030', '');
  44.  throw new Exception('Formularz wypełniony nieprawidłowo<br><br>');
  45. $mech_tabele->zamknij_wszytko();
  46. ?>

opłacalne? czy oprzeć na tablicy czy może jakoś inaczej?
bim2
Ja tu z obiektowości nie widze nic poza słowem class ohmy.gif

Klasa ma ułatwić programowanie, przyszybszyć je, a w twoim wypadku tylko spowalnia. Licz ile literek to zamknij_kolumne() a ile to </td> ?

Wywal wszystko co masz, co wiesz. Poczytaj jeszcze raz, pooglądaj przykłady w "Algorytmy, klasy funkcję" i napisz coś co się przyda, nic na siłę.
Crozin
Kod HTML generowany przez to nadaje się tylko do kosza - od formatowania jest CSS winksmiley.jpg
W dodatku trzeba wywoływać masę niepotrzebnych metod - wcale nie jest to wygodniejsze od ręcznego wklepania.

Generalnie nie ma chyba jakiegoś sztywnego wzorca - wszystko powinno być stworzone tak, aby działało jak najlepiej pod konkretny projekt.

Może to być coś takiego:
  1. <?php
  2. $table = new table(4); //ilość kolumn
  3. $table->addCell('trescKolumny1')->addCell('kolumny2');
  4. //....
  5. $table->addCell('kolumny3')->addCell('czwartej');
  6. //...
  7. $table->addCell('kolumny1 - wiersza 2 (samo przerzuci)');
  8. ?>
Ale jak napisałem - powinno to być zrobione pod konkretne zadanie.
Strzałek
Przede wszystkim - generowanie HTML za pomocą różnorodnych klas to jakaś pomyłka jest (przynajmniej dla mnie). Html się klepie ręcznie i tyle. Dla mnie to przerost formy nad treścią.

A kolega chce się nauczyć programowania obiektowego? Najlepiej uczyć się na jakiś przykładach. Poczytaj sobie kod frameworków - Symfony, Agavi, czy nawet ZF to powinno w pewnym momencie zaskoczyć własciwe rozumowanie winksmiley.jpg
Sedziwoj
Cytat(Strzałek @ 4.05.2008, 21:59:53 ) *
Przede wszystkim - generowanie HTML za pomocą różnorodnych klas to jakaś pomyłka jest (przynajmniej dla mnie). Html się klepie ręcznie i tyle. Dla mnie to przerost formy nad treścią.


W tych rzeczach co właściwie wyłącznie pojawiają się na forum, to tak, takie html w php...
Ale jak zamyka się większe logiczne komponenty i mają one swój sposób wyświetlania to inna sprawa.
Chociażby stronicowania, coś co generuje odpowiednie rzeczy, ładny obiektów kod, tylko co ma zrobić, nie jak, a potem jest szablon to prezentujący, wtedy grafik ma dostęp do niego może zmieniać, a obiektowość (czy w tym przypadku może jedna klasa) jest niewidzialna dla niego, a dla programisty nie ma html.
Może to proste napisanie tego, ale po co się bawić w stronicowanie za każdym razem, gdy parametrów jest niewiele ile stron, która obecnie, ile ma wyświetlić numerków w przód i tył itp., najczęściej będą tylko dwa używane, więc mając taki komponent to chwila i ma się stronicowanie.

To samo można osiągnąć w formularzach, ale to większa zabawa...
(hm, jeszcze nie miałem czasu przeczytać tego co Cysiaczek dał linka :| )
bziur
Powiem tak - dla mnie programowanie obiektowe przejawia sie nie tylko w kawalku kodu, ktory nazywa się klasa - jest to makro na makro, a wiec jedna wielka klasa generuje jeden wielki obiekt, a w kodzie nam to zajmuje kilka linijek. Uzywanie klas do generowania pojedynczych znacznikow HTML jest przelozeniem macro na micro, czyli wielka klasa generuje maly kod, a to juz niedobrze, bo marnuja sie bajciki  winksmiley.jpg

Bardzo dobrym przykladem dobrze napisanego obiektu-klasy jest klasa FCKeditora, ktorego kod tego typu:

  1. <?php
  2. $FCKeditor['articleText'] = new FCKeditor('text') ;
  3. $FCKeditor['articleText']->BasePath = 'FCKeditor/';
  4. $FCKeditor['articleText']->ToolbarSet = 'Default';
  5. $FCKeditor['articleText']->Value = 'testowy text';
  6. $FCKeditor['articleText']->Height = 400;
  7. $FCKeditor['articleText']->Width = '100%';
  8. ?>




generuje nam taki ladny edytor jak przedstawiony w odsylaczu: http://www.fckeditor.net/demo/language
Athlan
Po 1.
http://forum.php.pl/index.php?s=&showt...st&p=466253
Kolejne nie-OOP, kopiujesz metody jak popadnie. Nie lepiej miec metody, które wyzwalają inną metodę (wpisują typ i zakres danych) np protected $this->_pole_input( paramy ) i zastępują tylko type.

Po 2. Po grzyb pisać generator formularzy tongue.gif ? zawsze znajdzie się jakiś parametr, który odrzuci klasę, np dodatkowe atrybuty. Warto o tym pomyśleć i oprócz name itd dorobić metody addAttribute($sName, $sValue).

Po 3. Fajnie by było rozszerzyć takie klasę o validację, pobieranie wartości z POST'u jeżeli są przesłane, a jeżeli nie to z bazy danych (jeżeli to edycja czegoś, po postowaniu dane z bazy zamieniają się na dane z POST'u chwilowo w wyświetleniu formularza).

Ogólnie to nie OOP tongue.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.