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%)
-----


Serdecznie dziękuję za pomoc. Więc zgodnie z tym co napisał Erix i na podstawie klasy SingletonRegistry ze strony: http://www.phpfreaks.com/tutorial/design-p...gleton-registry zrobiłem tak:
  1. final class Polaczenie {
  2.  
  3. private static $oInstance = false;
  4. private $pdo;
  5. private $_map; //dla wzorca registry
  6.  
  7.  
  8. private $dsn = 'mysql:host=localhost;dbname=koszyk';
  9. private $uzytkownik = 'root';
  10. private $haslo = '';
  11.  
  12.  
  13.  
  14. private function __construct() {
  15. try {
  16. $this->pdo = new PDO($this->dsn, $this->uzytkownik, $this->haslo, array(PDO::MYSQL_ATTR_INIT_COMMAND=>"SET NAMES utf8"));
  17. $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  18.  
  19. $this->set('pdo', $this->pdo);
  20. }
  21. catch(PDOException $e) {
  22. echo '<p>Polaczenie nie moglo zostac utworzone: '.$e->getMessage().'</p>';
  23. }
  24. }
  25.  
  26. public function __destruct() {
  27.  
  28. }
  29.  
  30.  
  31. public static function getInstance() {
  32. if (self::$oInstance == false) {
  33. self::$oInstance = new klasaPolaczenie();
  34. }
  35. return self::$oInstance;
  36. }
  37.  
  38.  
  39. public function get($key)
  40. {
  41. return $this->_map[$key];
  42. }
  43.  
  44.  
  45. public function set($key, $object)
  46. {
  47. $this->_map[$key] = $object;
  48. }
  49.  
  50. }



Czyli dodałem:
  1. private $_map;
  2.  
  3. public function get($key)
  4. {
  5. return $this->_map[$key];
  6. }
  7.  
  8.  
  9. public function set($key, $object)
  10. {
  11. $this->_map[$key] = $object;
  12. }
  13.  
  14. //+ dla konstruktora: $this->set('pdo', $this->pdo);


A nastepnie:
  1. $zapytanie = $polaczenie->get('pdo')->prepare("INSERT INTO ksiazki(tytul, cena) VALUES(:tytul, :cena)");
  2. $zapytanie->bindValue(':tytul', $_POST['tytul'], PDO::PARAM_STR);
  3. $zapytanie->bindValue(':cena', $_POST['cena'], PDO::PARAM_STR);
  4. $zapytanie->execute();


I jest ok.

Ale jako ze teraz przeczytalem sposob Voida to skorzystam chyba z Jego sposobu (IMG:style_emoticons/default/smile.gif) Chyba, bo wszedzie pisza (w tym Wy piszecie) zeby nie korzystac z singletona to chcialbym sie zapytac co zamiast singletona gdy na jednej stronie uzywam np. 5. obiektow klas, w ktorych potrzebuje polaczenia z baza danych wiec tworze w ich konstruktorach obiekty klasy Polaczenie przez wywolanie statycznej metody getInstance():
  1. $this->polaczenie = Polaczenie::getInstance();

Czy jesli usune Singletona to czy nie bede miec 5. polaczen do bazy danych zamiast 1. ?

Ten post edytował wiewiorek 8.09.2009, 08:40:52
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: 7.10.2025 - 23:07