2011-01-29 22 views
6

Sto cercando di salvare un oggetto in $_SESSION, ma il seguente:php risparmio oggetto in sessione

<?php 

$user = db->load($username, $pass) ; 
$_SESSION[ 'user' ] = $user ; 

# on subsequent page loads: 
$user = $_SESSION[ 'user' ] ; #retrieve the user from session 

Purtroppo questo non funziona.

Lo script ha tentato di eseguire un metodo o accedere a una proprietà di un oggetto incompleto. Assicurati che la definizione di classe "Utente" dell'oggetto che stai cercando di operare sia stata caricata _before_ unserialize() venga chiamata o fornisca una funzione __autoload() per caricare la definizione di classe

A meno che non si usi serialize():

<?php 

$user = db->load($username, $pass) ; 
$_SESSION[ 'user' ] = serialize($user) ; 

# on subsequent page loads: 
$user = unserialize($_SESSION[ 'user' ]) ; #retrieve the user from session 

Suppongo che sia necessario un serializzazione perché le informazioni sulla sessione vengono salvate sul disco. Ma il PHP non dovrebbe essere abbastanza intelligente da serializzare le cose da solo?

E con l'uso di serializzare/_ unserialize _, è questo andare a lavorare adesso in modo affidabile? O ho bisogno di un metodo __serialize() nella mia classe PHP?

+0

Hai mai pensato di utilizzare Zend.Session? –

risposta

4

È necessario il __serialize() nella classe se l'oggetto deve eseguire un'azione prima di essere serializzato. Ad esempio se avesse un riferimento a un file aperto e quel file dovesse essere chiuso correttamente prima della serializzazione.

+2

In questo caso useresti __sleep e __wakeup

+2

Le mie scuse, questo è quello che intendevo, non esiste un metodo di php magic chiamato __serialize (). –

1

Potrebbe forse utilizzare var_export? L'ho appena saputo oggi, quindi forse non è così rilevante.

+0

'var_export()' non è in realtà una funzione di serializzazione. È solo per creare una rappresentazione stringa leggibile da una variabile (come 'var_dump()'. Non crea una rappresentazione completa della variabile, e non c'è una funzione inversa. Http://php.net/manual/en /function.var-export.php –

+1

@ Lèse La mia comprensione di 'var_export' era che la stringa restituita poteva essere evalata per ottenere (più o meno) la stessa variabile.È errato? – sdleihssirhc

+0

Ah, sei ho avuto confusione con 'print_r()'. Tuttavia, è ancora meglio serializzare gli oggetti con 'serialize()' in quanto vi sono alcuni casi in cui l'output di 'var_export()' non produce i risultati corretti (ad es. con riferimenti circolari) –

0

Per quanto riguarda il compilatore php, tutto ciò che si sta facendo è scrivere un oggetto (serializzato) in un array con un processo diverso che assicura $ _SESSION è disponibile nella pagina successiva. La serializzazione non ha nulla a che fare con la scrittura sul disco più sulla memoria poiché la memoria allocata a vari metodi sull'oggetto non sarà disponibile nella pagina successiva. La serializzazione è come il PHP trattiene gli oggetti sulle pagine e devi farlo tu stesso.

0

Meglio Usa

json_encode() json_decode() 
0

Probabilmente il miglior approccio questi giorni è quello di implementare Serializable interfaccia con la classe.