Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> instancje obiektow - jak to rozumiec, łamigłowka
mrok
post
Post #1





Grupa: Zarejestrowani
Postów: 258
Pomógł: 17
Dołączył: 22.05.2007

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


witam

czegos chyba nie do konca rozumiem i mam prosbę o wyjaśnienie (IMG:http://forum.php.pl/style_emoticons/default/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?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) ?

Ten post edytował mrok 4.03.2008, 22:57:58
Go to the top of the page
+Quote Post
Cezar708
post
Post #2





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

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


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
Go to the top of the page
+Quote Post
mrok
post
Post #3





Grupa: Zarejestrowani
Postów: 258
Pomógł: 17
Dołączył: 22.05.2007

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


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

bystre oko (IMG:http://forum.php.pl/style_emoticons/default/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
Go to the top of the page
+Quote Post
Cezar708
post
Post #4





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

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


he he, sorry nie odpowiadałem ale jakość tak inne posty (szczególnie gości (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) ) na tym forum mnie zaciekawiły (IMG:http://forum.php.pl/style_emoticons/default/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. ?>
Go to the top of the page
+Quote Post
mrok
post
Post #5





Grupa: Zarejestrowani
Postów: 258
Pomógł: 17
Dołączył: 22.05.2007

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


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??
Go to the top of the page
+Quote Post
Kocurro
post
Post #6





Grupa: Zarejestrowani
Postów: 461
Pomógł: 32
Dołączył: 17.09.2003
Skąd: Łódź

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


Chcesz tworzyc martwy obiekt zużywając na niego pamięć ?

pozdr.
Go to the top of the page
+Quote Post
mrok
post
Post #7





Grupa: Zarejestrowani
Postów: 258
Pomógł: 17
Dołączył: 22.05.2007

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


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
Go to the top of the page
+Quote Post
Kocurro
post
Post #8





Grupa: Zarejestrowani
Postów: 461
Pomógł: 32
Dołączył: 17.09.2003
Skąd: Łódź

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


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

pozdr.
Go to the top of the page
+Quote Post
mrok
post
Post #9





Grupa: Zarejestrowani
Postów: 258
Pomógł: 17
Dołączył: 22.05.2007

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


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

nie bede sie kłócił, ponieważ brak mi argumentów (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) , ale czy mógłbyś rozwinąc tę myśl?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)

czy jesli obiekt zwroci samego siebie to juz nie jest singletonem?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) ? przeciez dzieki temu mam zawsze jeden obiekt tego typu?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)


pozdrawiam
Go to the top of the page
+Quote Post
Kocurro
post
Post #10





Grupa: Zarejestrowani
Postów: 461
Pomógł: 32
Dołączył: 17.09.2003
Skąd: Łódź

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


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 (IMG:http://forum.php.pl/style_emoticons/default/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.

Ten post edytował Kocurro 7.03.2008, 12:17:50
Go to the top of the page
+Quote Post
mrok
post
Post #11





Grupa: Zarejestrowani
Postów: 258
Pomógł: 17
Dołączył: 22.05.2007

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


wow - widze drobne niuanse, a jednak roznica duza.

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

Pozdrawiam
Go to the top of the page
+Quote Post

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: 23.08.2025 - 08:51