Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Klasy abstrakcyjne...
Forum PHP.pl > Forum > Przedszkole
sloenthran
Otóż mam taki kod:

  1. <?php
  2.  
  3. class Buy
  4. {
  5.  
  6. private $_id_serwera;
  7. private $_flaga;
  8. private $_flaga_dostepu;
  9. private $_dni;
  10. private $_time;
  11.  
  12. public function __construct($id_serwera, $flaga, $flaga_dostepu, $dni, $time)
  13. {
  14.  
  15. $this->_id_serwera = $id_serwera;
  16. $this->_flaga = $flaga;
  17. $this->_flaga_dostepu = $flaga_dostepu;
  18. $this->_dni = $dni;
  19. $this->_time = $time;
  20.  
  21. }
  22.  
  23. public function sprawdz($kod_sms, $numer)
  24. {
  25.  
  26. $Zapytanie = @mysql_query("SELECT `api_gamesol` FROM ustawienia");
  27. $Pobieranie = @mysql_fetch_array($Zapytanie);
  28.  
  29. $API = $Pobieranie['api_gamesol'];
  30.  
  31. if($kod_sms == 'test1' || $kod_sms == 'test2' || $kod_sms == 'test3' || $kod_sms == 'test4' || $kod_sms == 'test5' || $kod_sms == 'test6' || $kod_sms == 'test9' || $kod_sms == 'test17' || $kod_sms == 'test20' || $kod_sms == 'test25')
  32. {
  33.  
  34. return false;
  35.  
  36. }
  37.  
  38. $wynik = file_get_contents("http://gamesol.pl/api/sms-pro.php?id=".$API."&taryfa=".$numer."&kod=".$kod_sms."&opis=sloenthran:shop");
  39.  
  40. $wynik_tab = json_decode($wynik, true);
  41.  
  42. if($wynik_tab['blad'] != 0)
  43. {
  44.  
  45. return false;
  46.  
  47. }
  48.  
  49. else
  50. {
  51.  
  52. return true;
  53.  
  54. }
  55.  
  56. return false;
  57.  
  58. }
  59.  
  60. public function zakoncz($nick, $haslo)
  61. {
  62.  
  63. if(!empty($nick) and !empty($haslo))
  64. {
  65.  
  66. $pass = md5($haslo);
  67. $upraw = $this -> _flaga;
  68. $flagi = $this -> CheckFree($this->_id_serwera, $nick, $upraw);
  69.  
  70. if(!$flagi)
  71. {
  72.  
  73. $exp = $this->_time + ($this->_dni * 86400);
  74.  
  75. mysql_query("INSERT INTO `amx_amxadmins` VALUES(NULL, '{$nick}', '{$pass}', '{$upraw}', '{$this->_flaga_dostepu}', '{$nick}', '{$nick}', 0, 0, '{$this->_time}', '{$exp}', {$this->_dni})");
  76.  
  77. $id = mysql_insert_id();
  78.  
  79. mysql_query("INSERT INTO `amx_admins_servers` VALUES({$id}, {$this->_id_serwera}, '', 'no')");
  80.  
  81. return TRUE;
  82.  
  83. }
  84.  
  85. else
  86. {
  87.  
  88. return TRUE;
  89.  
  90. }
  91.  
  92. }
  93.  
  94. return FALSE;
  95.  
  96. }
  97.  
  98. private function CheckFree($sid = 0, $na_co = '', $upraw = '')
  99. {
  100.  
  101. $query = @mysql_query("SELECT * FROM `amx_amxadmins` WHERE `steamid` = '{$na_co}'");
  102.  
  103. if(mysql_num_rows( $query ) > 0)
  104. {
  105.  
  106. $row = mysql_fetch_assoc($query);
  107. $newFlags = $this->sumFlags($row['access'], $upraw);
  108. $ex = ($this->_time + ((($row['expired'] - $this->_time) + ($this->dni * 86400)) / 2));
  109.  
  110. mysql_query("UPDATE `amx_amxadmins` SET `access` = '{$newFlags}' WHERE `steamid` = '{$na_co}'");
  111.  
  112. $query2 = mysql_query("SELECT * FROM `amx_admins_servers` WHERE `admin_id` = '{$row['id']}' AND `server_id` = '{$this->_id_serwera}'");
  113.  
  114. if(mysql_num_rows( $query2 ) > 0)
  115. {
  116.  
  117. return TRUE;
  118.  
  119. }
  120.  
  121. else
  122. {
  123.  
  124. mysql_query("INSERT INTO `amx_admins_servers` VALUES ({$row['id']}, {$this->_id_serwera}, '', 'no')");
  125. return TRUE;
  126.  
  127. }
  128.  
  129. return FALSE;
  130.  
  131. }
  132.  
  133. return FALSE;
  134.  
  135. }
  136.  
  137. private function sumFlags($flagi_a = "", $flagi_b = "")
  138. {
  139.  
  140. for($i = 0; $i < strlen($flagi_b); $i++)
  141. {
  142.  
  143. if(!(strlen(strstr($flagi_a, $flagi_b[$i]))))
  144. $out .= $flagi_b[$i];
  145.  
  146. }
  147.  
  148. $to = str_split($flagi_a . $out);
  149. sort($to);
  150. $ciag = implode('', $to);
  151.  
  152. return $ciag;
  153.  
  154. }
  155.  
  156. }
  157.  
  158. ?>


I ktoś powiedział mi że lepiej abym zamiast za każdym razem ciągle pisać (kilka tych samych klas tylko z zmienioną funkcją sprawdź) to samo to lepiej skorzystać z klas abstrakcyjnych bądź interfejsów... Próbowałem taką klasę samemu jednakże nic mi nie wychodzi... Czy mógłby ktoś z kodu wyżej napisać mi coś takiego?
buliq
interfejs odpada, bo nie zdefiniujesz tych powtarzających się metod.

W abstrakcji generalnie możesz połączyć interfejs z zwykłą klasą. Klasa abstrakcyjna może być zwykłą klasą (powiedzmy). Zatem, utworzenie klasy abstrakcyjnej:

  1. abstract class Name {}


W tej klasie robisz normalne metody, oraz metody abstrakcyjne. Metody abstrakcyjne nie posiadają ciała (definicji) a jedynie ich deklarację (nazwę, parametry, itd.). Przykład:

  1. abstract class Name {
  2.  
  3. public function cosTam($a) {
  4. echo $a;
  5. }
  6.  
  7. abstract public function innaMetoda($b, $c $d = null);
  8.  
  9. }


Następnie robisz drugą klasę która dziedziczy po tej klasie abstrakcyjnej, i tam definiujesz metodę innaMetoda
freemp3
Podstawowe pytanie, czy wiesz na jakiej zasadzie działają klasy abstrakcyjne oraz interfejsy? Pomysł dobry, ale nie ma potrzeby korzystania z klas abstrakcyjnych ani interfejsów. Zamiast nich możesz bezpośrednio dziedziczyć z tej klasy i nadpisywać te metody, które chcesz zmienić.

Odnośnie klas abstrakcyjnych to różnią się od zwykłych tym, że metody nie muszą mieć kodu i nie można z nich tworzyć obiektów. Można z nich jedynie dziedziczyć. Dlatego też klasa abstrakcyjna nie może być jednocześnie finalną. Co oczywiscie nie wyklucza tego, że może mieć finalne metody, pod warunkiem, że metoda nie jest abstrakcyjna wink.gif

Co do interfejsów to jest to spis metod publicznych, które nie mają "ciała". Nie mogą mieć one żadnego kodu oraz dostęp do nich musi być publiczny. Może wydawać się to dziwne, ale przydaje się np. do tworzenia API zewnętrznego. Każda nowa klasa w tedy musi zawierać pewien zestaw metod, które są zdefiniowane właśnie w interfejsie. Co one będą robić zależy już tylko i wyłącznie od klasy, ale wszystkie muszą być zaimplementowane.
sloenthran
Czyli rozumiem że jeżeli zapisałbym to tak:

  1. <?php
  2.  
  3. abstract class Buy
  4. {
  5.  
  6. private $_id_serwera;
  7. private $_flaga;
  8. private $_flaga_dostepu;
  9. private $_dni;
  10. private $_time;
  11.  
  12. public function __construct($id_serwera, $flaga, $flaga_dostepu, $dni, $time)
  13. {
  14.  
  15. $this->_id_serwera = $id_serwera;
  16. $this->_flaga = $flaga;
  17. $this->_flaga_dostepu = $flaga_dostepu;
  18. $this->_dni = $dni;
  19. $this->_time = $time;
  20.  
  21. }
  22.  
  23. public function zakoncz($nick, $haslo)
  24. {
  25.  
  26. if(!empty($nick) and !empty($haslo))
  27. {
  28.  
  29. $pass = md5($haslo);
  30. $upraw = $this -> _flaga;
  31. $flagi = $this -> CheckFree($this->_id_serwera, $nick, $upraw);
  32.  
  33. if(!$flagi)
  34. {
  35.  
  36. $exp = $this->_time + ($this->_dni * 86400);
  37.  
  38. mysql_query("INSERT INTO `amx_amxadmins` VALUES(NULL, '{$nick}', '{$pass}', '{$upraw}', '{$this->_flaga_dostepu}', '{$nick}', '{$nick}', 0, 0, '{$this->_time}', '{$exp}', {$this->_dni})");
  39.  
  40. $id = mysql_insert_id();
  41.  
  42. mysql_query("INSERT INTO `amx_admins_servers` VALUES({$id}, {$this->_id_serwera}, '', 'no')");
  43.  
  44. return TRUE;
  45.  
  46. }
  47.  
  48. else
  49. {
  50.  
  51. return TRUE;
  52.  
  53. }
  54.  
  55. }
  56.  
  57. return FALSE;
  58.  
  59. }
  60.  
  61. private function CheckFree($sid = 0, $na_co = '', $upraw = '')
  62. {
  63.  
  64. $query = @mysql_query("SELECT * FROM `amx_amxadmins` WHERE `steamid` = '{$na_co}'");
  65.  
  66. if(mysql_num_rows( $query ) > 0)
  67. {
  68.  
  69. $row = mysql_fetch_assoc($query);
  70. $newFlags = $this->sumFlags($row['access'], $upraw);
  71. $ex = ($this->_time + ((($row['expired'] - $this->_time) + ($this->dni * 86400)) / 2));
  72.  
  73. mysql_query("UPDATE `amx_amxadmins` SET `access` = '{$newFlags}' WHERE `steamid` = '{$na_co}'");
  74.  
  75. $query2 = mysql_query("SELECT * FROM `amx_admins_servers` WHERE `admin_id` = '{$row['id']}' AND `server_id` = '{$this->_id_serwera}'");
  76.  
  77. if(mysql_num_rows( $query2 ) > 0)
  78. {
  79.  
  80. return TRUE;
  81.  
  82. }
  83.  
  84. else
  85. {
  86.  
  87. mysql_query("INSERT INTO `amx_admins_servers` VALUES ({$row['id']}, {$this->_id_serwera}, '', 'no')");
  88. return TRUE;
  89.  
  90. }
  91.  
  92. return FALSE;
  93.  
  94. }
  95.  
  96. return FALSE;
  97.  
  98. }
  99.  
  100. private function sumFlags($flagi_a = "", $flagi_b = "")
  101. {
  102.  
  103. for($i = 0; $i < strlen($flagi_b); $i++)
  104. {
  105.  
  106. if(!(strlen(strstr($flagi_a, $flagi_b[$i]))))
  107. $out .= $flagi_b[$i];
  108.  
  109. }
  110.  
  111. $to = str_split($flagi_a . $out);
  112. sort($to);
  113. $ciag = implode('', $to);
  114.  
  115. return $ciag;
  116.  
  117. }
  118.  
  119. }
  120.  
  121. ?>


  1. class BuyTwo extends Buy
  2. {
  3.  
  4. public function sprawdz($kod_sms, $numer)
  5. {
  6.  
  7. $Zapytanie = @mysql_query("SELECT `api_gamesol` FROM ustawienia");
  8. $Pobieranie = @mysql_fetch_array($Zapytanie);
  9.  
  10. $API = $Pobieranie['api_gamesol'];
  11.  
  12. if($kod_sms == 'test1' || $kod_sms == 'test2' || $kod_sms == 'test3' || $kod_sms == 'test4' || $kod_sms == 'test5' || $kod_sms == 'test6' || $kod_sms == 'test9' || $kod_sms == 'test17' || $kod_sms == 'test20' || $kod_sms == 'test25')
  13. {
  14.  
  15. return false;
  16.  
  17. }
  18.  
  19. $wynik = file_get_contents("http://gamesol.pl/api/sms-pro.php?id=".$API."&taryfa=".$numer."&kod=".$kod_sms."&opis=sloenthran:shop");
  20.  
  21. $wynik_tab = json_decode($wynik, true);
  22.  
  23. if($wynik_tab['blad'] != 0)
  24. {
  25.  
  26. return false;
  27.  
  28. }
  29.  
  30. else
  31. {
  32.  
  33. return true;
  34.  
  35. }
  36.  
  37. return false;
  38.  
  39. }
  40.  
  41. }


To będzie wtedy działać tak samo jakbym zapisał to razem czy czegoś nie rozumiem? smile.gif
buliq
Tak, tylko. Jeżeli definiujesz ze klasa jest abstrakcyjna, warto z tej abstrakcji skorzystać. Nie zadeklarowałeś metody sprawdz w klasie Buy. Deklaracja wymusi na każdej klasie dziedziczącej definicję tej metody.
freemp3
Tak. Możesz też dodać w klasie Buy metodę:
Kod
abstract public function sprawdz();

W tedy jak zapomnisz jej dodać w klasie dziedziczącej to wyświetli się błąd, który Ci o tym przypomni wink.gif
sloenthran
OK dzięki wam za pomoc 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.