Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> programowanie obiektowe
mhs
post 22.06.2004, 07:51:27
Post #1





Grupa: Zarejestrowani
Postów: 764
Pomógł: 3
Dołączył: 30.04.2003

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


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
Go to the top of the page
+Quote Post
rze-X-nik
post 22.06.2004, 08:21:20
Post #2





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 20.03.2004
Skąd: Szczebrzeszyn

Ostrzeżenie: (10%)
X----


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


--------------------
while(!$wakacje){ czekaj();
}
if($wakacje){ yuppie();
} exit;
Go to the top of the page
+Quote Post
party
post 22.06.2004, 08:40:30
Post #3





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 19.08.2003
Skąd: Bydgoszcz

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


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. ?>


--------------------
Go to the top of the page
+Quote Post
DeyV
post 22.06.2004, 08:45:07
Post #4





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




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. ?>


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
mhs
post 22.06.2004, 09:05:56
Post #5





Grupa: Zarejestrowani
Postów: 764
Pomógł: 3
Dołączył: 30.04.2003

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


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...
Go to the top of the page
+Quote Post
DeyV
post 22.06.2004, 09:13:48
Post #6





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




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.


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
mhs
post 22.06.2004, 09:18:53
Post #7





Grupa: Zarejestrowani
Postów: 764
Pomógł: 3
Dołączył: 30.04.2003

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


hmm....

moglbys podac przyklad tego zastosowania, o ktorym piszesz, gdyz nie za bardzo wiem jak mam do tego pojesc i zastosowac to...
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 02:25