Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> obiekt klasy X powinien wywolac metode z klasy Y bez dziedziczenia
wiewiorek
post
Post #1





Grupa: Zarejestrowani
Postów: 247
Pomógł: 11
Dołączył: 5.09.2009

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


Jeśli mam klasę o nazwie Polaczenie z prywatnym konstruktorem do połączenia z bazą danych, a chciałbym używać PDO (PDO umożliwia komunikację z wieloma bazami danych) to przez to, że mam prywatny konstruktor to nie mogę dziedziczyć po klasie PDO, bo inaczej dostaję błąd:
Access level to Polaczenie::__construct() must be public (as in class PDO)

A ja chcialbym moc wysylac zapytania do bazy danych przy uzyciu funkcji prepare() pochodzacej z klasy PDO w ten sposob:
  1. $polaczenie = Polaczenie::getInstance();
  2. $zapytanie = $polaczenie->prepare("INSERT INTO ksiazki(tytul, cena) VALUES(:tytul, :cena)");
  3. $zapytanie->bindValue(':tytul', $_POST['tytul'], PDO::PARAM_STR);
  4. $zapytanie->bindValue(':cena', $_POST['cena'], PDO::PARAM_STR);
  5. $zapytanie->execute();


Ale dostaje blad:
Call to undefined method Polaczenie::prepare()

Bo ta metoda jest w klasie PDO. Co mam zrobic ? Moglbym caly powyzszy kod wstawic do specjalnie utworzonej w tym celu metody w klasie Polaczenie i wtedy byloby ok, ale co ja mam tworzyc dla kazdego inserta oddzielna metode w klasie Polaczenie ? To jak mialbym inserty wykonywane na tabelach np. ksiazki, autorzy itd. ladowac je wszystkie do klasy Polaczenie ? Bez sensu. Co powinienem zrobic ?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
wiewiorek
post
Post #2





Grupa: Zarejestrowani
Postów: 247
Pomógł: 11
Dołączył: 5.09.2009

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


Erix wielkie dzieki za propozycje, niestety po zastosowaniu Twego sposobu do swojej klasy (i oczywiscie zmodyfikowaniu Twego kodu pod swoje potrzeby) dostaje blad ( (IMG:style_emoticons/default/tongue.gif) ):
Call to a member function pobieranieDanych() on a non-object
u Ciebie to bylaby ta linia:
  1. $q = parent::$connection->query('asdasd');


Jesli chodzi o singleton to wiem, ze zawsze jest jedno polaczenie, chodzilo mi o sytuacje gdybym nie zastosowal wzorca Singleton do klasy Polaczenie,
a inne klasy dziedziczylyby po klasie Polaczenie - przyklad:

  1. class Polaczenie extends PDO{
  2.  
  3. private $pdo;
  4.  
  5. private $dsn = 'mysql:host=localhost;dbname=koszyk';
  6. private $uzytkownik = 'root';
  7. private $haslo = '';
  8.  
  9.  
  10. public function __construct() {
  11. try {
  12. $this->pdo = new PDO($this->dsn, $this->uzytkownik, $this->haslo, array(PDO::MYSQL_ATTR_INIT_COMMAND=>"SET NAMES utf8"));
  13. $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  14. }
  15. catch(PDOException $e) {
  16. echo '<p>Polaczenie nie moglo zostac utworzone: '.$e->getMessage().'</p>';
  17. }
  18. }
  19.  
  20. public function __destruct() {
  21. }
  22.  
  23.  
  24. public function zapytanie($z) {
  25. try{
  26. $wynik = $this->pdo->query($z);
  27. $wynik_tablica = $wynik->fetchAll();
  28. $wynik -> closeCursor();
  29. return $wynik_tablica;
  30. }
  31. catch(PDOException $e) {
  32. echo '<p>blad w metodzie pobieranieDanych(): '.$e->getMessage().'</p>';
  33. }
  34. }
  35.  
  36. }
  37.  
  38. ------------------------------
  39. class Ksiazki extends Polaczenie
  40. {
  41. private $polaczenie;
  42.  
  43. public function __construct()
  44. {
  45. $this->polaczenie = new Polaczenie();
  46. }
  47.  
  48. public function __destruct()
  49. {
  50. }
  51.  
  52. public function pobierzKsiazki()
  53. {
  54. return $this->polaczenie->zapytanie("SELECT * FROM ksiazki");
  55. }
  56. }
  57.  
  58. --------------------------------------------------------------
  59.  
  60. class Autorzy extends Polaczenie
  61. {
  62. private $polaczenie;
  63.  
  64. public function __construct()
  65. {
  66. $this->polaczenie = new Polaczenie();
  67. }
  68.  
  69. public function __destruct()
  70. {
  71. }
  72.  
  73. public function pobierzAutorow()
  74. {
  75. return $this->polaczenie->zapytanie("SELECT * FROM autorzy");
  76. }
  77. }
  78.  
  79. -------------------------
  80.  
  81. $ksiazki = new Ksiazki();
  82. $rezultat1 = $ksiazki->pobierzKsiazki();
  83.  
  84.  
  85. $autorzy = new Autorzy();
  86. $rezultat2 = $autorzy->pobierzAutorow();
  87.  


To wtedy utworzenie dwoch obiektow oznaczaloby pewnie dwa polaczenia do bazy danych zamiast jednego jak w przypadku zastosowania wzorca singleton do klasy Polaczenie.





Najlepszym wyjsciem jest chyba tworzenie obiektu klasy Polaczenie i przekazywanie go do konstruktorow pozostalych klas:


  1. class Polaczenie extends PDO{
  2.  
  3. private $pdo;
  4.  
  5. private $dsn = 'mysql:host=localhost;dbname=koszyk';
  6. private $uzytkownik = 'root';
  7. private $haslo = '';
  8.  
  9.  
  10. public function __construct() {
  11. try {
  12. $this->pdo = new PDO($this->dsn, $this->uzytkownik, $this->haslo, array(PDO::MYSQL_ATTR_INIT_COMMAND=>"SET NAMES utf8"));
  13. $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  14. }
  15. catch(PDOException $e) {
  16. echo '<p>Polaczenie nie moglo zostac utworzone: '.$e->getMessage().'</p>';
  17. }
  18. }
  19.  
  20. public function __destruct() {
  21. }
  22.  
  23.  
  24. public function pobieranieDanych($z) {
  25. try{
  26. $wynik = $this->pdo->query($z);
  27. $wynik_tablica = $wynik->fetchAll();
  28. $wynik -> closeCursor();
  29. return $wynik_tablica;
  30. }
  31. catch(PDOException $e) {
  32. echo '<p>blad w metodzie pobieranieDanych(): '.$e->getMessage().'</p>';
  33. }
  34. }
  35.  
  36. }
  37.  
  38. ----------------------------------------------
  39.  
  40. class Ksiazki
  41. {
  42. private $polaczenie;
  43.  
  44. public function __construct($db)
  45. {
  46. $this->polaczenie = $db;
  47. }
  48.  
  49. public function __destruct()
  50. {
  51. }
  52.  
  53. public function pobierzKsiazki()
  54. {
  55. return $this->polaczenie->pobieranieDanych("SELECT * FROM ksiazki");
  56. }
  57. }
  58.  
  59. -----------------------------------------------------------------
  60.  
  61. $polaczenie = new klasaPolaczenie();
  62.  
  63. $ksiazki = new klasaKsiazki($polaczenie);
  64. $rezultat_1 = $ksiazki->pobierzKsiazki();
  65.  
  66. $ksiazki2 = new klasaKsiazki($polaczenie);
  67. $rezultat_2 = $ksiazki->pobierzKsiazki();


Ten post edytował wiewiorek 8.09.2009, 16:43:37
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 3.10.2025 - 19:10