Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [OOP] Klasa do tworzenia drzewa
Forum PHP.pl > Forum > PHP > Object-oriented programming
kitol
Witam. Wprawiam się dopiero w OOP. W ramach ćwiczeń postanowiłem stworzyć klasę do tworzenia formularzy. Po pewnym czasie zorientowałem się ze klasa jest na tyle uniwersalna, że można nia tworzyć całe dokumenty.
W założeniach ma działać analogicznie jak JS metody CreateElement() itp.

Podstawą jest klasa htmlElement - opisuje pojedynczy element drzewa będący na końcu gałęzi (liść) - to znaczy taki który nie posiada dzieci
Drugą klasą jest klasa node - opisuje ona węzeł drzewa, może posiadać dzieci którymi mogą być zarówno inne klasy node jak i htmlElement. node dziedziczy z htmlElement.
Klasom zaimplementowałem konstruktory oraz metody genHtml() służące generowaniu kodu.
Oprócz tego stworzyłem 3 dodatkowe klasy których jedynym zadaniem jest uproszcone generowanie instancji klas htmlElement i node są to:inputSubmit, textarea, inputText.

Moje pytania:
czy to jest właściwe podejście do OOP?
czy popełniłem jakieś błędy? jakie?

Konstruktory klas mają możliwość podania jednego lub dwóch argumentów. W tym celu do każdego konstruktora musiałem dodać:
  1. <?php
  2. if (func_num_args()==2) {
  3. $arg_list = func_get_args();
  4. $this->attribs=$arg_list[1];
  5. }
  6. ?>

Czy da się to uprościć?

Nie jestem pewien czy przypisywanie w konstruktorze $this->attribs=$arg_list[1]; (tabeli z argumentu funkcji do wnętrza klasy jest prawidłowe) Co prawda działa, ale....

Chcę zaznaczyć że są to moje pierwsze kroki w OOP i przedstawiam jedynie szkielet klasy którą mam zamiar rozbudować. Będę wdzięczny za wszelkie opinie.

Teraz kod:
  1. <?php
  2. class htmlElement {
  3. public $tag;
  4. public $innerHtml;
  5. public $attribs;
  6.  
  7. function __construct($tag) {
  8. $this->tag=$tag;
  9. if (func_num_args()==2) {
  10. $arg_list = func_get_args();
  11. $this->attribs=$arg_list[1];
  12. }
  13. }
  14.  
  15. function makeOpenTag() {
  16. $r='<'.$this->tag;
  17. if (count($this->attribs)) foreach ($this->attribs as $key=>$val) $r.=' '.$key.'="'.$val.'"';
  18. return $r.'>';
  19. }
  20.  
  21. function makeCloseTag() {
  22. return '</'.$this->tag.'>';
  23. }
  24.  
  25. function genHtml(){
  26. return $this->makeOpenTag().$this->innerHtml;
  27. }
  28. }
  29.  
  30. class inputText extends htmlElement {
  31. function __construct($name) {
  32. if (func_num_args()==2) {
  33. $arg_list = func_get_args();
  34. $this->attribs=$arg_list[1];
  35. }
  36. $this->tag='input';
  37. $this->attribs['type']='text';
  38. $this->attribs['name']=$name;
  39. }
  40. }
  41.  
  42. class inputSubmit extends htmlElement {
  43. function __construct($name) {
  44. if (func_num_args()==2) {
  45. $arg_list = func_get_args();
  46. $this->attribs=$arg_list[1];
  47. }
  48. $this->attribs['type']='submit';
  49. $this->attribs['name']=$name;
  50. }
  51. }
  52.  
  53. class textarea extends node {
  54. function __construct($name) {
  55. if (func_num_args()==2) {
  56. $arg_list = func_get_args();
  57. $this->attribs=$arg_list[1];
  58. }
  59. $this->tag='input';
  60. $this->tag='textarea';
  61. $this->attribs['name']=$name;
  62. }
  63. }
  64.  
  65. class node extends htmlElement {
  66. public $parent;
  67. public $childs;
  68.  
  69. function __construct($tag){
  70. $this->tag=$tag;
  71.  
  72. if (func_num_args()==2) {
  73. $arg_list = func_get_args();
  74. $this->attribs=$arg_list[1];
  75. }
  76. }
  77.  
  78. function add($element){
  79. $this->childs[]=$element;
  80. }
  81.  
  82. function genHtml(){
  83. $html=$this->makeOpenTag();
  84. if (count($this->childs)) foreach ($this->childs as $formEl) $html.=$formEl->genHtml();
  85. $html.=$this->makeCloseTag();
  86. return $html;
  87. }
  88. }
  89.  
  90. $root=new node('div');
  91. $root->add(new htmlElement('input', Array( 'type'=>'text', 'name'=>'t1')));
  92. $root->add(new textarea('ta1'));
  93. $root->add(new htmlElement('input', Array( 'type'=>'button', 'name'=>'t2')));
  94. $root->add(new inputText('t3'));
  95.  
  96. $n_node=new node('div');
  97. $n_node->add(new htmlElement('input',Array( 'type'=>'button', 'name'=>'end', 'value' =>'Zakończ')));
  98. $root->add($n_node);
  99.  
  100. echo $root->genHtml();
  101. ?>
Sedziwoj
Hm... http://pl.php.net/manual/en/ref.dom.php
mike
I znów wyważane otwartych drzwi i wynajdywanie koła na nowo.
A słyszałeś o XMLWriter lub czym innym co tworzy XMLe?
Sedziwoj
Co do formularzy, to raczej powinno się ułatwiać a nie utrudniać, no i rozdzielić kod html od PHP.
Więc jak masz element do formularza to każdy musi mieć jakąś nazwę, więc logiczne aby było "coś" między np. inputText a htmlElement, taki ogólny element który ma metodę steName($strName), powinna też być prosta możliwość dodawania jakiejś walidacji np. addValidator( Validator $validator ), aby móc używać jakiś standardowych elementów, a tworzenie było łatwiejsze.

Co do kodu, to na pewno powinieneś się zaprzyjaźnić z parent::__construct() i pochodnymi, jak i widocznością metod czyli np. protected function makeOpenTag().
No i możesz używać (a raczej powinieneś) public function __construct( $strTagType, $arrAttribute = array() )... widzę tu braki pewnych bardziej podstawowych rzeczy. (no i na boga używaj zawsze {} nie ważne że nie wymagane, bo potem czytać kod bez nich i bez wcięć to masakra).

Dobra to trochę ode mnie, bo nie analizuję tego głębiej.

@mike
Wolę operacje na węzłach niż, pisanie prawie jakby xml tylko trochę inaczej. (chyba za dużo zabawy drzewem html w JS biggrin.gif)

Choć mi bardziej jednak chodziło o http://pl.php.net/manual/en/ref.domxml.php niż to poprzednie... (szczerze to nie używałem, wystarczało mi SimpleXML)
mike
Cytat(Sedziwoj @ 21.02.2008, 16:22:40 ) *
@mike
Wolę operacje na węzłach niż, pisanie prawie jakby xml tylko trochę inaczej. (chyba za dużo zabawy drzewem html w JS biggrin.gif)
To zależy od tego czego potrzebujesz. Każda biblioteka ma "zady" i "walety" tongue.gif
Do dużych XMLi zastosowanie czegoś budowanego na węzłach to pomyłka.
Sedziwoj
@mike
Jak to mówią, nie zawsze robi się to co się lubi.
Bo to że takie coś jak odwzorowanie drzewa XML do czysto obiektowej postaci jest kosztowne, każdy chyba wie.
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.