Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem z widocznością obiektu
amytych
post 28.07.2007, 17:24:25
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 28.07.2007

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


Mam następujący problem, mam plik z funkcjami zarządzającymi sesją, w funkcjach wykorzystywany jest obiekt $db klasy DBSql, chodzi o to że obiekt ten jest widoczny w pliku, ale nie jest widoczny w funkcji, mimo zadeklarowania go:

  1. <?php
  2. global $db;
  3. ?>


Przez to cały czas dostaję błąd:

Fatal error: Call to a member function query() on a non-object in /radioprosfera/greets/includes/session.php on line 41

Co może być przyczyną?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
mike
post 28.07.2007, 19:00:09
Post #2





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


1. Przenoszę na PHP. Jak ktoś korzysta z global to niech nie mówi że to jest programowanie obiektowe tongue.gif
2. Błąd, który dostajesz nie jest rezultatem braku widoczności tej zmiennej, tylko jest wynikiem tego że wykonujesz funkcję na czymś co nie jest obiektem. Gdzie tworzysz instancję klasy DBSql :?:
Go to the top of the page
+Quote Post
amytych
post 28.07.2007, 19:10:59
Post #3





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 28.07.2007

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


  1. <?php
  2. //Tworzy nowy obiekt
  3. $db = new DBSql(DBHOST, DBUSER, DBPASS, DBNAME);
  4. ?>


Wszystko jest ok, w tym miejscu, tzn $db jest obiektem

Następnie chcę go wykorzystać w funkcji

  1. <?php
  2. function sess_write($id, $data)
  3. {
  4. global $db;
  5. $db->query("REPLACE INTO ".TBL_SESSION."(session_id, data, modtime) VALUES('".$id."', '".$data."', null)"); //linia powodująca błąd
  6. return true;
  7. }
  8. ?>


i tutaj dostaję infromację, że $db obiektem nie jest

Ten post edytował amytych 29.07.2007, 22:14:43
Go to the top of the page
+Quote Post
Kamil J.
post 28.07.2007, 21:42:06
Post #4





Grupa: Zarejestrowani
Postów: 51
Pomógł: 0
Dołączył: 29.12.2005
Skąd: Łódź

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


Ten post nie będzie odpowiedzią na Twój problem, ale poradą jak można sobie poradzić z tym trochę bardziej obiektowo.

Możesz użyć wzorca singleton.

Pisząc przykładowy kod rozszerzyłem klasę DBSql, ponieważ założyłem, że DBSql to jakaś gotowa klasa i wtedy nie musisz w niej grzebać. Oczywiście możesz dołączyć wzorzec singleton do DBSql bez jej rozszerzania.

  1. <?php
  2. require_once('twoja_sciezka_do_DBSql');
  3.  
  4. class DB extends DBSql
  5. {
  6. private static $oInstance;
  7.  
  8. private function __construct()
  9. {
  10. parent::__construct(DBHOST, DBUSER, DBPASS, DBNAME);
  11. }
  12.  
  13. // Jeśli instancja istnieje zwraca mi zapisaną, która już ma połączenie z baza. Je
    śli nie - tworzy nową i zapisuje ją w statycznej zmiennej $oInstance, następnie zwraca. D
    zięki temu masz kontrole, że będzie jedno połączenie z bazą i że będziesz się móg
    ł wszedzie odwołać do tego samego połączenia bez użycia globals ;-)
  14. public static function singleton()
  15. {
  16. if (!isset(self::$oInstance)) {
  17. $sClassName = __CLASS__;
  18.  
  19. // wywoluje funkcję __construct(), która tworzy połączenie z bazą
  20. self::$oInstance = new $sClassName;
  21. }
  22.  
  23. return self::$oInstance;
  24. }
  25.  
  26.  
  27. // Prevent users to clone the instance
  28. public function __clone()
  29. {
  30. trigger_error('Clone is not allowed.', E_USER_ERROR);
  31. }
  32. }
  33.  
  34. // Wywołuje statyczną metodę singleton(), ponieważ jest wywoływana 1 raz tworzy instancję klasy i ją zapisuje.
  35. $oDb = DB::singleton(); 
  36.  
  37. // Ponownie wywołuje singleton(), lecz teraz już nie tworzy nowej ihstancji klasy tylko zwraca już wcześnie
    j zapisaną.
  38. $oDb2 = DB::singleton();
  39.  
  40.  
  41. // teraz se możesz wywołać sesje
  42.  
  43. // ...
  44. ?>


  1. <?php
  2. function sess_write($id, $data)
  3. {
  4. $db = DB::singleton();
  5. $db->query("REPLACE INTO ".TBL_SESSION."(session_id, data, modtime) VALUES('".$id."', '".$data."', null)"); 
  6. return true;
  7. }
  8. ?>


W razie wątpliwości pytaj.

Pozdrawiam.


--------------------
Workspace: Ubuntu 8.04, PDT.
Go to the top of the page
+Quote Post
amytych
post 29.07.2007, 20:47:18
Post #5





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 28.07.2007

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


Wielkie dzięki za okazaną pomoc, ale w międzyczasie miałem możliwość przetestowania tego rozwiązania na innym serwerze (dokładnie na dwóch różnych) i tam wszystko było ok, tzn. $db w funkcji było obiektem, więc wydaje mi się, że problem chyba musi leżeć po stronie serwera, może jego konfiguracji, nie mam pojęcia...
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: 14.08.2025 - 03:37