Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> instancje obiektow - jak to rozumiec, łamigłowka
mrok
post 4.03.2008, 22:17:37
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 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?

Ten post edytował mrok 4.03.2008, 22:57:58


--------------------
Go to the top of the page
+Quote Post
Cezar708
post 4.03.2008, 22:26:34
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 4.03.2008, 22:35:59
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 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 4.03.2008, 22:55:26
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 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. ?>
Go to the top of the page
+Quote Post
mrok
post 4.03.2008, 23:09:06
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 4.03.2008, 23:58:20
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 5.03.2008, 00:14:10
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 5.03.2008, 20:45:22
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 5.03.2008, 22:48:58
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 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


--------------------
Go to the top of the page
+Quote Post
Kocurro
post 7.03.2008, 12:17:22
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 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 7.03.2008, 19:29:35
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
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 16.04.2024 - 16:29