Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Własna obsługa sesji w klasie problem w 5.2.5
Forum PHP.pl > Forum > PHP
jk1980
Witam,

W wersji PHP 5.2.5 pojawił się pewien problem, którego poprzednio nie było.
Najlepiej wyjaśnię o co chodzi na przykładzie.

Kod wygląda następująco, został on trochę zmodyfikowany, żeby był jak najkrótszy, ale żeby wystąpił problem.
Normalnie klasy są w osobnych plikach dołączane require_once.
  1. <?php
  2.  
  3. class ApplicationCore
  4. {
  5. var $_appInitialized;
  6.  
  7. function ApplicationCore()
  8. {
  9. $this->_appInitialized = FALSE;
  10. }
  11.  
  12. function initializeApplication()
  13. {
  14. $this->_appInitialized = TRUE;
  15. }
  16. }
  17.  
  18. $appCore = new ApplicationCore();
  19. $appCore->initializeApplication();
  20.  
  21. class CustomSession
  22. {
  23. var $_sessionTable;
  24.  
  25. function CustomSession()
  26. {
  27. global $appCore;
  28.  
  29. echo 'CustomSession: ';
  30. echo var_dump($appCore).'<br>';
  31.  
  32. $this->setSessionTable('active_session');
  33. array(&$this, "_open"),
  34. array(&$this, "_close"),
  35. array(&$this, "_read"),
  36. array(&$this, "_write"),
  37. array(&$this, "_destroy"),
  38. array(&$this, "_gc"));
  39. }
  40.  
  41. function setSessionTable($tablename)
  42. {
  43. global $appCore;
  44.  
  45. echo 'setSessionTable: ';
  46. echo var_dump($appCore).'<br>';
  47.  
  48. if($tablename<>NULL)
  49. {
  50. $this->_sessionTable = $tablename;
  51. return TRUE;
  52. }
  53. else
  54. {
  55. return FALSE;
  56. }
  57. }
  58.  
  59. function getSessionTable()
  60. {
  61. return $this->_sessionTable;
  62. }
  63.  
  64. function _open($save_path, $session_name)
  65. {
  66. global $appCore;
  67.  
  68. echo '_open: ';
  69. echo var_dump($appCore).'<br>';
  70.  
  71. return TRUE;
  72. }
  73.  
  74. function _close()
  75. {
  76. global $appCore;
  77. echo '_close: ';
  78. echo var_dump($appCore).'<br>';
  79.  
  80. $this->_gc(0);
  81. return TRUE;
  82. }
  83.  
  84. function _read($session_id)
  85. {
  86. global $appCore;
  87. echo '_read: ';
  88. echo var_dump($appCore).'<br>';
  89. }
  90.  
  91. function _write($session_id, $session_data)
  92. {
  93. global $appCore;
  94. echo '_write: ';
  95. echo var_dump($appCore).'<br>';
  96. }
  97.  
  98. function _destroy($session_id)
  99. {
  100. global $appCore;
  101. echo '_destroy: ';
  102. echo var_dump($appCore).'<br>';
  103. }
  104.  
  105. function _gc($maxlifetime)
  106. {
  107. global $appCore;
  108. echo '_gc: ';
  109. echo var_dump($appCore).'<br>';
  110. }
  111. }
  112.  
  113. $sess = new CustomSession();
  114.  
  115.  
  116. ?>


Widać dwie klasy CustomSession do obsługi sesji oraz ApplicationCore z całym balastem do łączenia z bazą i innymi.

Oto co wyświetla przeglądarka:

CODE
CustomSession: object(ApplicationCore)#1 (1) { ["_appInitialized"]=> bool(true) }
setSessionTable: object(ApplicationCore)#1 (1) { ["_appInitialized"]=> bool(true) }
_open: object(ApplicationCore)#1 (1) { ["_appInitialized"]=> bool(true) }
_read: object(ApplicationCore)#1 (1) { ["_appInitialized"]=> bool(true) }
_write: NULL
_close: NULL
_gc: NULL


Oczywiście problemem są te NULL'e, co w rezultacie skutkuje:
Fatal error: Call to a member function Query() on a non-object in

Siedzę już nad tym drugi dzień i zgłupiałem.
Jeśli ktoś byłby w stanie pomóc to byłoby super.

Pozdrawiam
erix
  1. global $appCore;

Po co robisz obiektowo, jak kod jest naszpikowany globalami...? Bezsens.

Cytat
Oczywiście problemem są te NULL'e, co w rezultacie skutkuje:
Fatal error: Call to a member function Query() on a non-object in

Ale która metoda wywołuje w ogóle Query? Bo jakoś w tym listingu tego nie widać.
jk1980
Historia była taka, że w oryginalnym projekcie wyskakiwał właśnie ten Fatal error: Call to a member function Query() on a non-object in
Po analizie doszedłem do tego, że w niektórych metodach tej klasy CustomSession appCore pomimo iż jest global to i tak wywala, że jest null.
Dlatego sporządziłem przykładowy kod, żeby pokazać naturę problemu. W oryginale wszystko jest w różnych plikach
Dodatkowo obłożyłem go global'ami, żeby pokazać co się dzieje.

Acha, a to Query jest między innymi w metodach _write, _read, _destroy i powoduje ono wysłanie zapytania do bazy (Query jest metodą z appCore). Tylko wywaliłem je z tego przykładu, żeby nie zaciemniać.
Chodzi więc o to, dlaczego w jednych metodach tej samej klasy pokazuje NULL a w innych nie...
erix
Powiem to tak - przerób najpierw to na Singleton zamiast globali. Może gdzieś po prostu wykonujesz przypisanie, które to wszystko zeruje, albo wykonuje się w innej kolejności. Singletona nie wyzerujesz, więc będą dwie pieczenie na jednym ogniu. winksmiley.jpg
jk1980
Przerobienie nic nie da. Załóżmy, że to jest cały kod, nie ma żadnego Query.
Gdybym chciał w metodzie _write, wykonać jakąkolwiek metodę z klasy ApplicationCore wywali błąd, ale ta sama metoda wywołana z _read błędu nie wywali.
Nic nie jest po drodze zerowane.

Co ciekawe wszystko działa ok w PHP 5.1.5, natomiast w PHP 5.2.5 już nie.

Wydaje mi się, że to ma coś wspólnego z tym, że to ma obsługiwać sesje, i prawdopodobnie jakimś cudem metoda _write jest wywoływana przed utworzeniem obiektu ApplicationCore.
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.