Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PDO singleton
Forum PHP.pl > Forum > PHP > Object-oriented programming
tabbi
  1. class Mysql{
  2.  
  3. public $db;
  4. static private $instance = null;
  5.  
  6. private function __construct(){
  7.  
  8. $Parm['DBHost'] = 'localhost';
  9. $Parm['DBLogin'] = 'szpital';
  10. $Parm['DBPass'] = 'asdasd';
  11. $Parm['DBName'] = 'prorapid';
  12. $Parm['DBType'] = 'mysql';
  13. try
  14. {
  15. $this->db = new PDO($Parm['DBType'].':dbname='.$Parm['DBName'].';host='.$Parm['DBHost'], $Parm['DBLogin'], $Parm['DBPass']);
  16. $this->db-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  17. }
  18. //Wyświetlanie błędów wrazie niepowodzenia uruchamiania rozszerzenia
  19. catch(PDOException $e)
  20. {
  21. echo $e->getMessage();
  22. }
  23.  
  24. }
  25.  
  26. static public function getInstance(){
  27. if(self::$instance == null){
  28. $c= __CLASS__;
  29. self::$instance = new $c();
  30. }
  31. return self::$instance;
  32. }
  33. }
  34.  
  35. class Pliki {
  36.  
  37. //dołączenie referencji z class_serwisy.php class_mysql.php
  38. private $serwer = null;
  39. private $db = null;
  40.  
  41. function __construct($ID){
  42.  
  43. //doczepienie klasy class_serwisy.php
  44. //$this->serwer=Serwisy::getInstance();
  45.  
  46. //doczepienie klasy class_mysql.php
  47. $this->db=Mysql::getInstance();
  48. }
  49.  
  50. function Fileserve($data){
  51.  
  52. $result=$this->db->prepare("
  53. SELECT
  54. sname, pass
  55. FROM
  56. demo_servers
  57. WHERE
  58. selected = 1
  59. ORDER BY traffic_left
  60. DESC LIMIT 1
  61. ");
  62. $result->execute();
  63. $account=$result->fetch(PDO::FETCH_ASSOC);
  64. }
  65. }
  66.  
  67. $id=1;
  68. $pliki = new Pliki($id);
  69. $data=1;
  70. $x=$pliki->Fileserve($data);


I wywala blad call to undefined method Mysql::prepare() czyli obiekt PDO nie jest stworzony a raczej zreferowany z Klasy Mysql. Pytanie czemu sie tak dzieje, troche przeczytałem o singleton i ten wzorzecz projektowy jest ciekawy, tworzy obiekt raz a nastepnie jesli obiekt jest stworzony to tworzy referencje do niego i dzieki czemu jest mniejszy poziom alokowanej pamieci. JEDNAK ;p nie o tym pisać ale nie potrafie sobie poradzić z tym błędem. Więc prosiłbym o konkretne pokazanie patrz na ta linijke tu masz błąd tongue.gif dzieki wielkie siedze nad tym już troche i nie potrafie pójść dalej.
wookieb
  1. class Mysql extends PDO

A wtedy w konstruktorze zamiast
  1. $this->db = new PDO($Parm['DBType'].':dbname='.$Parm['DBName'].';host='.$Parm['DBHost'], $Parm['DBLogin'], $Parm['DBPass']);


dajesz
  1. parent::__construct($Parm['DBType'].':dbname='.$Parm['DBName'].';host='.$Parm['DBHost'], $Parm['DBLogin'], $Parm['DBPass']);
Crozin
Widzisz gdzieś by klasa MySQL definiowała metodę prepare() albo by takową dziedziczyła? Nie.
Obiekt PDO masz dostępny pod MySQL->db, więc jeżeli obiekt MySQL masz dostępny pod Plik->db to z poziomu obiektu Plik musisz odwołać się przez Plik->db->db->prepare().

Nie masz też pojęcia czym jest Singleton i gdzie powinien być on wykorzystywany (w przypadku aplikacji WWW praktycznie nie ma dla niego zastosowań). Nie można go wiązać też z jakimkolwiek zużyciem pamięci, bo nie ma on z tym nic wspólnego.

Swoją drogą jaki jest cel istnienia klasy MySQL, skoro ona nie robi kompletnie niczego.
tabbi
Crozin jak zwykle motywująco tongue.gif z każdą Twoją uwagą pragne uczyć się więcej.
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.