Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z widocznością obiektu
Forum PHP.pl > Forum > PHP
amytych
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ą?
mike
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 :?:
amytych
  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
Kamil J.
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.
amytych
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...
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.