2009-03-02 18 views
5

Mam skrypt PHP, który jest wywoływany na 2 sposoby z połączenia xhrGet do Ajaksu Dojo. Po raz pierwszy jest wywoływany z argumentem "init", który powoduje, że skrypt tworzy instancję klasy StateList i czyta w pliku nazw stanów.Dlaczego nie mogę przechowywać instancji klasy PHP jako zmiennej SESJI

session_start(); 
@include('StateList.php'); 
require_once('phplog.php'); 

//start executing here 
$comd=$_GET['nexturl']; 
if($comd=="init") { 
$st = new StateList("../data/statestxt.txt"); 
$_SESSION['statefile'] = $st; 
} 

drugi i kolejne razy, kolejne wezwanie xhrGet przechodzi „getstate” argument i następujący kod próbuje uzyskać instancję ofr klasy StateList z tablicy sesji.

if($comd =="getstate") { 
$st= $_SESSION['statefile']; 
phplog("size=".$st->getSize()); 

}

Jednak metoda getSize() nigdy nie jest wykonywana, ani mogę zadzwonić jakakolwiek inna metoda na odtworzonego instancji klasy StateList.

Należy zauważyć, że jest to jeden skrypt PHP, który zawiera definicję klasy u góry , a zatem metody klasy powinny być znane i dostępne.

Czego mi tu brakuje?

+0

Postaraj się unikać @; po prostu napisz swój kod poprawnie, aby nie było żadnych błędów do zniesienia. –

Odpowiedz

1

Przed zapisaniem obiektu/zmiennej $ st możesz potrzebować do serialize. Zapewni to, że wszystko zostanie zapisane w sesji. Jest to zdecydowanie droga do uzyskania kodu object oriented. Gdy chcesz ponownie użyć danych, musisz je ustawić.

+6

Zmienne sesji są automatycznie szeregowane i nieserializowane. – outis

14

Musisz podać definicję klasy, zanim zadzwonisz pod numer session_start(), w przeciwnym razie obiekt nie zostanie poprawnie sformatowany i będzie instancją __PHP_Incomplete_Class. W przeciwnym razie to, co masz, powinno działać dobrze.

+1

Jeśli przenoszę definicję zgodnie z sugestią, wartość zwrócona z tablicy sesji ma wartość NULL. –

+0

czy masz włączone display_errors i error_reporting E_ALL? Czy możesz upewnić się, że pierwszy bit rzeczywiście działa ($ comd == "init")? –

0

Jeśli zamierzasz przechowywać obiekt w sesji, musi to być link text. Istnieje wiele problemów z serializowaniem obiektów w PHP, nie mówiąc już o przechowywaniu ich w sesji. Odradzam wykonanie tego wszystkiego i znalezienie innego rozwiązania dla twojego problemu. Jeśli jednak zamierzasz to zrobić, powinieneś przyjrzeć się "magicznym metodom" link text, które powinieneś zdefiniować w swojej klasie, aby ułatwić jej przywrócenie, gdy zostanie wywołana z sesji.

0

Czy masz włączoną session.auto_start? Strona sesja instrukcji stwierdza, że ​​jeśli to zrobisz, musisz wczytać definicję klasy inaczej:

Jeśli włączysz session.auto_start to jedynym sposobem, aby umieścić obiekty w sesji jest załadowanie jej definicja klasy przy użyciu auto_prepend_file w której wczytujesz definicję klasy, będziesz musiał serializować obiekt i odserializować go później.

http://php.net/manual/en/intro.session.php

Jako że strona mówi, serializacji/odserializacji obiektu będzie normalnie odbywa się automatycznie przez PHP, ale po session.auto_start włączona będzie to zmienić.

+0

Nie jest nieaktywny. –

1

Jest to jedna z tych rzeczy, które trudno oddzielić w izolacji. Przechowywanie instancji obiektów w sesjach PHP jest zawsze trochę skomplikowane, a nie gwarantowane w 100%. Oto kilka ogólnych wskazówek na temat debugowania, które mogą pomóc Ci to zrozumieć.

Najpierw sprawdź swój dziennik błędów apache. Czy otrzymujesz "metodę wywołaną na błędzie nieobiektowym"?Jeśli tak, oznacza to, że nie wycofujesz obiektu z sesji. Jeśli nie, czy wystąpił błąd wskazujący, że twoja metoda nie działa z innego powodu?

Po drugie, sprawdź, co naprawdę wydostaje się z sesji.

if($comd =="getstate") { 
    $st= $_SESSION['statefile']; 
    //get the class of st 
    phplog("instance=".get_class($st)); 

    //get a reflection dump of st 
    $ref = new ReflectionClass($st); 
    $string = $ref->__toString();  
    phplog("reflection=".$string); 
} 

Po trzecie, spójrz na serializowaną wartość ciągu, która jest przechowywana w samej sesji. Czy rzeczywiście przechowujesz obiekt serializowany? W środowisku dev, należy ustawić wartość session.save_path ini w php.ini do czegoś/tmp (lub użyć metody ini_set zrobić to samo):

session.save_path = "/tmp" 

a następnie zbadać pliki utworzone w/tmp (lub jakikolwiek folder). Powinien pojawić się napis zaczynający się od:

statefile:O:.......... 

Nazwa klasy, która instancja obiektu będzie również tam, jak również wartości zapisanej do właściwości.

0

Spróbuj tego:

include('StateList.php'); 
    require_once('phplog.php'); 
    // start your session after including your class file 
    session_start(); 

    //start executing here 
    $comd=$_GET['nexturl']; 
    if($comd=="init") { 
    $st = new StateList("../data/statestxt.txt"); 
    $_SESSION['statefile'] = $st; 
    } 

    if($comd =="getstate") { 
    // the ampersand creates a reference, preserving any further changes to your session data 
    $st = &$_SESSION['statefile']; 
    phplog("size=".$st->getSize()); 
    } 
+0

interesujący kod. Myślę, że mógłbym spróbować. – transilvlad

Powiązane problemy