Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: programowanie obiektowe
Forum PHP.pl > Forum > PHP
mhs
Witam serdecznie,

Mam prosta klase mysql, w ktorej fragment jest nastepujacy:

  1. <?php
  2.  
  3. class mysql
  4. {
  5. // nazwa hosta
  6. var $host = '';
  7.  
  8. // nazwa uzytkownika bazy danych;
  9. var $uzytkownik = '';
  10.  
  11. // haslo uzytkownika bazy danych
  12. var $haslo = '';
  13.  
  14. // nazwa bazy danych
  15. var $baza = '';
  16.  
  17. // oznaczenie polaczenia trwalego
  18. var $trwale = '';
  19.  
  20. // id polaczenia z baza danych
  21. var $polaczenie = NULL;
  22.  
  23. // wynik wykonanego zapytania;
  24. var $wynikZapytania = false;
  25.  
  26.  
  27.  
  28. function mysql($host = '', $uzytkownik = '', $haslo = '', $baza = '', $trwale = true) {
  29. $this->host = $host;
  30. $this->uzytkownik = $uzytkownik;
  31. $this->haslo = $haslo;
  32. $this->baza = $baza;
  33. $this->trwale = $trwale;
  34. }
  35.  
  36.  
  37. /**
  38.  * @desc Metoda otwierajaca polaczenie z baza danych
  39.  *
  40.  * @return true - nawizano polaczenie z systemem MySQL
  41.  * @return false - polaczenie z MySQL nie zostalo nawiazane
  42.  */
  43. function polaczenieOtworz() {
  44. if ($this->trwale)
  45. $funkcja = 'mysql_pconnect';
  46. else
  47. $funkcja = 'mysql_connect';
  48.  
  49. $this->polaczenie = @$funkcja($this->host, $this->uzytkownik, $this->haslo);
  50.  
  51. if ($this->polaczenie) {
  52. if (@mysql_select_db($this->baza, $this->polaczenie))
  53. return true;
  54. else {
  55. return false;
  56. }
  57. }
  58. else
  59. return false;
  60. }
  61.  
  62.  
  63. /**
  64.  * @desc Zamkniecie polaczenia z baza danych
  65.  */
  66. function polaczenieZamknij() {
  67. return (@mysql_close($this->polaczenie));
  68. }
  69.  
  70.  
  71. /**
  72.  * @desc Wyslanie zapytania do serwera mysql
  73.  */
  74. function zapytanieWyslij($zapytanie = '') {
  75. $this->wynikZapytania = @mysql_query($zapytanie, $this->polaczenie);
  76. }
  77.  
  78.  
  79. /**
  80.  * @desc Zwrocenie ilosci przetworzonych wierszy przy ostatniej operacji
  81.  */
  82. function zapytanieAffected() {
  83. return @mysql_affected_rows($this->polaczenie);
  84. }
  85.  
  86.  
  87. /**
  88.  * @desc Pobranie wygenerowanego numeru id przy ostatnim zapytaniu (INSERT)
  89.  */
  90. function pobierzId() {
  91. return @mysql_insert_id($this->polaczenie);
  92. }
  93. }
  94.  
  95. ?>


Teraz zakladam, ze w moim projekcie bedzie co najmniej kilka innych klas (np. wiadomosci, komentarze, itd). Chcialem sie zapytac w jaki sposob moge korzystac w innych klasach z medot udostepnianych przez klase mysql (pod podstawowymi metodami klas np. wiadomosci bedzie dodawanie, usuwanie wiadomosci przez co musze w tym momencie korzystac z bazy danych). Wiem, ze moge zrobic to poprzez dziedziczenie:

  1. <?php
  2.  
  3.  
  4. // zaladowanie biblioteki mysql
  5. require_once('mysql.class.php');
  6.  
  7.  
  8. class wiadomosci extends mysql
  9. {
  10. // Numer id wiadomosci
  11. var $wiadomosci_id;
  12.  
  13. // konstrukcja zapytania
  14. var $zapytanie;
  15.  
  16.  
  17. function wiadomosci() {}
  18.  
  19.  
  20. /**
  21.  * @desc Dodanie nowej wiadomosci
  22.  */
  23. function dodajWiadomosc($wiadomosc_temat, $wprowadzenie, $publikacja, $uzytkownik_id) {
  24.  
  25. // nawiazanie polaczenia z systemem zarzadzania baza danych
  26. $bd = new mysql(BD_HOST, BD_UZYTKOWNIK, BD_HASLO, BD_BAZA);
  27. $bd->polaczenieOtworz();
  28.  
  29. // dodanie nowego rekordu do tabeli wiadomosci
  30. $this->zapytanie = ' INSERT INTO
  31. wiadomosci
  32. (wiadomosc_temat, wiadomosc_wprowadzenie, wiadomosc_publikacja)
  33. VALUES (\"'.
  34. addslashes($wiadomosc_temat).'\"\"'.
  35. addslashes($wprowadzenie).'\"\"'.
  36. addslashes($publikacja).'\")';
  37.  
  38. // wyslanie zapytania
  39. $bd->zapytanieWyslij($this->zapytanie);
  40.  
  41. // pobranie numeru identyfikujacego wiadomosc
  42. $this->wiadomosc_id = $bd->pobierzId();
  43.  
  44. // sprawdzenie, czy zostal pobrany numer id wiadomosci
  45. if ($this->wiadomosc_id > 0) {
  46. // dodanie danych do tabeli 'uzytkownicy_wiadomosci'
  47. echo $this->zapytanie = '  INSERT INTO
  48. uzytkownicy_wiadomosci
  49. VALUES ('.
  50. addslashes($uzytkownik_id).', '.
  51. addslashes($this->wiadomosc_id).')';
  52.  
  53. // wyslanie zapytania
  54. $bd->zapytanieWyslij($this->zapytanie);
  55.  
  56. if ($bd->zapytanieAffected())
  57. return true;
  58. else
  59. return false;
  60. }
  61. }// koniec dodajWiadomosc()
  62. }
  63.  
  64.  
  65. ?>


- jednak co sie stanie gdy bede chcial w innej klasie skorzystac z metod dostepnych w klasie mysql i wiadomosci. Z tego co wiem to nie ma mozliwosci dziedziczenia wielokrotnego w php4.

Czy wyzej zaprezentowane postepowanie jest sluszne... prosze o komentarze.

Dzieki za informacje.
mhs
rze-X-nik
nie wiem, czy dobrze zrozumiałem, ale chyba chodzi Ci o to:

  1. <?php
  2.  
  3. $klasa = new mysql();
  4. //Mogłem zrobić tu u góry buraka ()
  5.  
  6. //i teraz w innych klasach dajesz ewentualnie global, a potem
  7.  
  8. $zmienna = $klasa->funkcja();
  9.  
  10. //A jeśli nie zadeklarujesz nowej klasym to wtedy:
  11.  
  12. $zmienna = mysql::funkcja();
  13. ?>


Sprawdź najpierw ten kod, bo rzadko kiedy bawię się klasami
party
Ja bym zrobił tak:
  1. <?php
  2. require_once('twój_sterownik_mysql.php');
  3.  
  4. class foo
  5. {
  6.  var $bar  = '';
  7.  var $mysql = '';
  8.  
  9.  function foo()
  10.  {
  11. $this -> mysql = new mysql( ... );
  12.  }
  13.  
  14.  function bar()
  15.  {
  16. $this -> mysql -> polaczenieOtworz();
  17.  }
  18. }
  19.  
  20. ?>
DeyV
Cytat
Z tego co wiem to nie ma mozliwosci dziedziczenia wielokrotnego w php4.

Nie ma czegoś takiego:
  1. <?
  2. class test extends class1, class2
  3. { } ?>



ale oczywiście dozwolona jest taka konstrukcja
  1. <?
  2. class t1 { }
  3. class t2 extends t1 { }
  4. class t3 extends t2 { }
  5. ?>
mhs
Cytat(DeyV @ 2004-06-22 08:45:07)
ale oczywiście dozwolona jest taka konstrukcja
  1. <?
  2. class t1 { }
  3. class t2 extends t1 { }
  4. class t3 extends t2 { }
  5. ?>

czyli w moim przypadku wszystkie klasy, ktore beda wykorzystywac system mysql bede dziedziczyc wszystkie metody po klasie mysql...

w Twoim przykladzie w klasie t3 beda dostepne wszystkie metody z klasy t1, tak

mam jeszcze takie pytanie... czy powyzsze postepowanie (tego rodzaju dziedziczenie, ktore zaprezentowales) to dobry nawyk czy raczej tego unikac...
DeyV
taka forma konstruowania skrptów jest bardzo wygodna, i znacznie ułatwia testowanie i rozbudowę.

Jednak w tym przypadku (mówię konkretnie o narzędziach do łączenia z bazą danych, templatesach itp) lepszym rozwiązaniem jest korzystać z obiektu danego typu, niż z dziedziczenia, gdzyż dzięki temu unikasz wielu połączeń z bazą danych (a tu dla każdej klasy miałbyś osobne) a kolejne klasy niech się w jakiś sposób odwołują do jego referencji.
mhs
hmm....

moglbys podac przyklad tego zastosowania, o ktorym piszesz, gdyz nie za bardzo wiem jak mam do tego pojesc i zastosowac to...
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.