Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> klasa Session
ayeo
post
Post #1





Grupa: Przyjaciele php.pl
Postów: 1 202
Pomógł: 117
Dołączył: 13.04.2007
Skąd: 127.0.0.1

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


Mam taki oto kod:
  1. <?php
  2. class UserSession {
  3.  
  4. public function __construct() {
  5.  
  6. array($this, '_session_open_method'), 
  7. array($this, '_session_close_method'), 
  8. array($this, '_session_read_method'), 
  9. array($this, '_session_write_method'), 
  10. array($this, '_session_destroy_method'), 
  11. array($this, '_session_gc_method')
  12. );
  13. }
  14.  
  15.  private function _session_open_method() {
  16.  
  17.  }
  18.  
  19.  private function _session_read_method() {
  20.  
  21.  
  22.  }
  23.  
  24.  private function _session_close_method() {
  25.  return(true);
  26.  }
  27.  
  28.  private function _session_gc_method() {
  29.  
  30.  }
  31.  
  32.  private function _session_write_method($id, $sess_data) {
  33.  
  34.  }
  35.  
  36.  private function _session_destroy_method() {
  37.  
  38.  }
  39. }
  40. ?>


Tworzę nową instancję tej klasy, co automatycznie uruchamia sesje. Problem jest z metodami _session_write_method i _session_close_method. Mianowicie gdy PHP chce się do nich odwołać wywala błąd:

Call to private method....

Może mi ktoś wytłumaczyć czemu tak się dzieje? Przecież w handlerze sessji jest referencja do obiektu więc czemu nie może korzystać z prywatnych metod? Dodam jeszcze, że pozostałe metody działają bez zarzutu! W manualu jest wzmianka, że sesja jest zamykana/zapisywana już po zlikwidowaniu obiektów. Problem rozwiązuje dodanie session_write_close(); do destructora. To też jest dla mnie nie jasne. Skoro obiekt już nie istnieje to jak sesja wywołuje te metody jeśli są nawet publiczne? (jeżeli metody są publiczne wszytsko działa bez zarzutu!).

Ten post edytował harold1982 21.11.2007, 12:23:35


--------------------
Go to the top of the page
+Quote Post
splatch
post
Post #2





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

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


Private - do użytku tylko poprzez instancje danej klasy, mówiąc prościej do metod prywatnych odwołujesz się tylko przez $this.

Z punku widzenia PHP wygląda to tak:
  1. <?php $session = new UserSession();?>


Gdzieś w innym miejscu:
  1. <?php $phpSessionHandler->_session_close_method(); ?>


--------------------
Łukasz Dywicki
Independent Java and open source software consultant.
Blog - Java, OSGi, integracja oprogramowania..
Go to the top of the page
+Quote Post
ayeo
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 1 202
Pomógł: 117
Dołączył: 13.04.2007
Skąd: 127.0.0.1

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


No ale przecież te metody są wywolywane z instancji klasy! I dlaczego na przykład _session_open_method() działa jako prywatna??

Ten post edytował harold1982 21.11.2007, 12:55:48


--------------------
Go to the top of the page
+Quote Post
splatch
post
Post #4





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

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


Są wywoływane na instancji a nie wewnątrz instancji. Do session_save_handlera przekazujesz informację obiekt + metoda. Konstrukcja array($this, '_session_open_method') to w PHP tak zwany callback i jest on później wywoływany z zewnątrz, ponieważ mechanizm obsługujący sesje nie jest uruchamiany wewnątrz instancji UserSession.

Przykładowy kod, który obrazuje to zachowanie:
  1. <?php
  2.  
  3. class CallbackTest {
  4.  
  5. public function getCallback() {
  6. return array($this, 'dontCallMe');
  7. }
  8.  
  9. public function doSomething() {
  10. call_user_func_array($this->getCallback(), 'ff');
  11. }
  12.  
  13. private function dontCallMe($param) {
  14. echo 'uruchomiles zabroniona metode '. $param;
  15. }
  16. }
  17.  
  18. $test = new CallbackTest();
  19. $test->doSomething();
  20.  
  21. $cb = $test->getCallback();
  22. call_user_func($cb, 'ff2'); // i tutaj mamy błąd
  23.  
  24. ?>


Komunikat, którym skrypt kończy działanie to:
Warning: call_user_func(CallbackTest::dontCallMe) [function.call-user-func]: First argument is expected to be a valid callback in callback.php on line 22


--------------------
Łukasz Dywicki
Independent Java and open source software consultant.
Blog - Java, OSGi, integracja oprogramowania..
Go to the top of the page
+Quote Post
ayeo
post
Post #5





Grupa: Przyjaciele php.pl
Postów: 1 202
Pomógł: 117
Dołączył: 13.04.2007
Skąd: 127.0.0.1

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


Dzięki za szybkie odpowiedzi. Dalej nie rozumiem dlaczego niektóre metody działaja, a inne nie... W sensie czemu działa wszystko opróc write, close?

[edit] session_start() użyłem w konstruktorze. Dzięki temu proces inicjacji sesji (open,read) może korzystać z prywatnych metod tej klasy. Obiekty w PHP5.0.5+ likwidowane są najpierw więc umieszczenie w destruktorze (czyli we wnętrzu klasy - czyli z dostępem do prywatnych metod) session_write_close() rozwiązuje pozornie problem dostępu do prywatnych metod z zewnątrz....

Ten post edytował harold1982 21.11.2007, 13:48:16


--------------------
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 Aktualny czas: 22.08.2025 - 02:12