Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: instancje obiektow - jak to rozumiec
Forum PHP.pl > Forum > PHP > Object-oriented programming
mrok
witam

czegos chyba nie do konca rozumiem i mam prosbę o wyjaśnienie winksmiley.jpg

Mam kod jak ponizej:

  1. <?php
  2. class DataBase{
  3. private static $AdoDbLiteInstance = null;
  4.  
  5. private function __construct ( )
  6. {
  7. echo 'konstruktor<br>';  //1
  8. self::$AdoDbLiteInstance = NewADOConnection("mysqlt");
  9. self::$AdoDbLiteInstance->Connect($dbHost, $dbUser, $dbPass, $dbName);
  10.  
  11. self::$AdoDbLiteInstance->Execute("SELECT * FROM tabla"); //2
  12. echo self::$AdoDbLiteInstance.'<br>'; //3
  13. }
  14.  
  15. public static function getInstance ( )
  16. {
  17. echo 'getinstance<br>'; //4
  18. if (is_null(self::$AdoDbLiteInstance))
  19. self::$AdoDbLiteInstance = new self();
  20. echo self::$AdoDbLiteInstance.'<br>'; //5
  21. self::$AdoDbLiteInstance->Execute("SELECT * FROM tabla"); //6
  22. return self::$AdoDbLiteInstance;
  23. }
  24. }
  25. ?>


wynikiem dzialania
$db = DataBase::getInstance(); jest

Cytat
getinstance //4
konstruktor //1
Object id #4 //3
Object id #3 //5

Fatal error: Call to undefined method DataBase::Execute() in class/DataBase.class.php on line 32 //6


zmienna $AdoDbLiteInstance jest zmienna statyczna i stale odwoluje sie do niej przez self:: - nie wiem dlaczego wiec raz jest to object4 a raz object3. Ma ktos jakis pomysl?questionmark.gif?
Cezar708
w linii 3 (private static = null;) masz parsera, brakuje Ci nazwy zmiennej

poza tym nie wiadomo gdzie masz określone zmienne $dbHost, $dbUser, $dbPass, $dbName, jeśli to wszystko sobie poustawiałem to mi zadziałało (wydaje mi się że wg założenia)

Pozdrawiam
mrok
Cytat
w linii 3 (private static = null;) masz parsera, brakuje Ci nazwy zmiennej

bystre oko winksmiley.jpg - juz poprawilem, ale nie tu lezy problem - niestety

Cytat
poza tym nie wiadomo gdzie masz określone zmienne $dbHost, $dbUser, $dbPass, $dbName

wyrzucilem te linie aby nie wrzucac 60linii kodu (wtedy pewnie nikt w niego nie spojrzy)
Zauwaz ze w wynikach nie ma nic na temat niezdefiniowanych zmiennych
Cezar708
he he, sorry nie odpowiadałem ale jakość tak inne posty (szczególnie gości winksmiley.jpg ) na tym forum mnie zaciekawiły winksmiley.jpg


otóż masz błąd:


linia 19: self::$AdoDbLiteInstance = new self();

czyli wywołujesz konstruktor... a w konstruktorze odwołujesz się do tej samej zmiennej statycznej:

linia 8: self::$AdoDbLiteInstance = NewADOConnection("mysqlt");

czyli program na pewno ma błąd logiczny. Nie wiem co chcesz osiągnąć ale na 99% pewności (opartej o nazwę tej zmiennej statycznej) trzeba zmienić linię 19 z:

  1. <?php
  2. self::$AdoDbLiteInstance = new self();
  3. ?>


na :

  1. <?php
  2. new self();
  3. ?>
mrok
Masz racje Cezar708. dziekuje bardzo.

Czyli tak lopatologicznie - ja probowalem przypisac obiekt do tej zmiennej
Cytat
self::$AdoDbLiteInstance = new self();

zamist odpalic konstruktor
Cytat
new self();

ktory wykona na niej odpowiednie operacje??
czy tak??
Kocurro
Chcesz tworzyc martwy obiekt zużywając na niego pamięć ?

pozdr.
mrok
Cytat
Chcesz tworzyc martwy obiekt zużywając na niego pamięć ?

Dlaczego martwy - to typowy singleton tylko na poczatku troche go zepsulem??

dzieki temu potem w kodzie w jakimkolwiek obiekcie moge wywolac cos takiego
  1. <?php
  2. $db = DataBase::getInstance();
  3. ?>

i juz mam obiekt $db klasy AdoDb z jednym aktywnym polaczeniem do bazy. Nie musze duzej ilosci zmiennych przekazywac w parametrach, a i obiekt mam tylko jeden wiec ograniczam zuzycie pamieci.


pozdrawiam
Kocurro
No właśnie ... to NIE JEST singleton ...

pozdr.
mrok
Cytat
No właśnie ... to NIE JEST singleton ...

nie bede sie kłócił, ponieważ brak mi argumentów winksmiley.jpg, ale czy mógłbyś rozwinąc tę myśl?questionmark.gif

czy jesli obiekt zwroci samego siebie to juz nie jest singletonem?questionmark.gif? przeciez dzieki temu mam zawsze jeden obiekt tego typu?questionmark.gif


pozdrawiam
Kocurro
Twój kod:

  1. <?php
  2. class DataBase{
  3. private static $AdoDbLiteInstance = null;
  4.  
  5. private function __construct ( )
  6. {
  7. echo 'konstruktor<br>';  //1
  8. self::$AdoDbLiteInstance = NewADOConnection("mysqlt");
  9. self::$AdoDbLiteInstance->Connect($dbHost, $dbUser, $dbPass, $dbName);
  10.  
  11. self::$AdoDbLiteInstance->Execute("SELECT * FROM tabla"); //2
  12. echo self::$AdoDbLiteInstance.'<br>'; //3
  13. }
  14.  
  15. public static function getInstance ( )
  16. {
  17. echo 'getinstance<br>'; //4
  18. if (is_null(self::$AdoDbLiteInstance))
  19.  new self();
  20. echo self::$AdoDbLiteInstance.'<br>'; //5
  21. self::$AdoDbLiteInstance->Execute("SELECT * FROM tabla"); //6
  22. return self::$AdoDbLiteInstance;
  23. }
  24. }
  25. ?>


Natomiast poprawny kod to byłby np.

  1. <?
  2.  
  3. class DataBase extends
  4. {
  5.  private static $_instance;
  6.  private $_ado;
  7.  
  8.  private function __construct()
  9.  {
  10. $this->_ado = NewADOConnection("mysqlt");
  11. $this->_ado->Connect($dbHost, $dbUser, $dbPass, $dbName);
  12.  
  13. $this->_ado->Execute("SELECT * FROM tabla"); //2
  14.  }
  15.  
  16. public static function getInstance()
  17. {
  18.  
  19. if (is_null(self::$AdoDbLiteInstance))
  20.  self::$AdoDbLiteInstance = new self();
  21. return self::$AdoDbLiteInstance;
  22. }
  23.  
  24. public static function getADO()
  25. {
  26. if (is_null(self::$AdoDbLiteInstance))
  27.  self::$AdoDbLiteInstance = new self();
  28. return self::$AdoDbLiteInstance->_ado;
  29. }
  30. }
  31. ?>


Pisane na szybko z palca by uzmysłowić o co chodzi winksmiley.jpg

Ogólnie chodzi o to by nie mieszać części statycznej od części dynamicznej. Część dynamiczna nie powinna dotykać części statycznej.

W Twoim przypadku o wiele lepiej byś zrobił jakbyś napisał zamiast swojego taki kod:

  1. <?php
  2. class DataBase{
  3. private static $AdoDbLiteInstance = null;
  4.  
  5. public static function getInstance ( )
  6. {
  7. echo 'getinstance<br>'; //4
  8. if (is_null(self::$AdoDbLiteInstance))
  9. {
  10. self::$AdoDbLiteInstance = NewADOConnection("mysqlt");
  11. self::$AdoDbLiteInstance->Connect($dbHost, $dbUser, $dbPass, $dbName);
  12.  
  13. self::$AdoDbLiteInstance->Execute("SELECT * FROM tabla"); //2  
  14. }
  15. echo self::$AdoDbLiteInstance.'<br>'; //5
  16. self::$AdoDbLiteInstance->Execute("SELECT * FROM tabla"); //6
  17. return self::$AdoDbLiteInstance;
  18. }
  19. }
  20. ?>


Dzięki temu nie tworzysz obiektu do którego nie masz nigdzie uchwytu.

pozdr.
mrok
wow - widze drobne niuanse, a jednak roznica duza.

Dzieki za wytlumaczenia. Twoj pomysł, jak to zrobić lepiej jest swietny. Dziekuję

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