Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Classe, oggetto e sessione

    Ho un problema con una classe serializzata in una sessione.

    Quando la pagina viene ricaricata, e l'oggetto viene deserializzato, non viene mantenuto cosi com'è ma viene dichiarata una nuova classe e quindi un nuovo oggetto, andando a perdere tutti i dati passati.

    Come posso risolvere?

  2. #2
    Moderatore di Windows e software L'avatar di URANIO
    Registrato dal
    Dec 1999
    residenza
    Casalpusterlengo (LO)
    Messaggi
    1,290
    Il problema può dipendere da molte cose....
    Una oggeto deserializzato conterrà tuti i valori precedenti.
    Puoi agire in fase di deserializzazione con funzioni specifiche come wakeup(o qualcosa del genere, non ricordo), ma da quello che racconti sembra che sia sbagliato qualcosa.

  3. #3
    Sto agendo su una pagina da me creata all'interno di un cms. Dal forum di supporto mi dicono di non serializzare una classe.
    Io sto utilizzando wfCart che è una classe php per la gestione di un carrello elettronico.
    Esterna al cms funziona, se la chiamata e le funzioni di gestione sono chiamate dal cms invece, mi ritornano quel problema.

  4. #4
    Moderatore di Windows e software L'avatar di URANIO
    Registrato dal
    Dec 1999
    residenza
    Casalpusterlengo (LO)
    Messaggi
    1,290
    Be se ti dicono che non si può serializzare non si può
    Se la classe ad esempio contiene tipi risorsa non funziona la serializzazione, o meglio funziona ma dovresti ricreare la risorsa.

  5. #5
    In che senso tipi risorsa?

    Come potrei ricreare la risorsa?

  6. #6
    Moderatore di Windows e software L'avatar di URANIO
    Registrato dal
    Dec 1999
    residenza
    Casalpusterlengo (LO)
    Messaggi
    1,290
    Era un esempio dei limiti della serializazzione.
    "mysql_query " restituisce una risorsa e non un semplice Array.
    http://www.php.net/manual/en/languag...s.resource.php
    Sono risorse esterne, qualcosa a cui "accedi".

    Ma anche mettiamo che hai una classe che controlla se sei loggato in base ad un timestamp, alla deserializzazione potrebbe avere un calore che non si aspetta.

    Insomma, devi conoscere la classe se vuoi serializzarla.

    Esistono delle funzioni speciali che sono __sleep e __wakeup (mi pare) che vengono chiamate prima della de/serializzazione per gestire appunto questi casi speciali, ma devi sapere cosa fare.

  7. #7
    Ho risolto, almeno mi sembra, sto facendo delle prove,

    prima di tutto, se esiste, recupero l'oggetto e lo deserializzo

    if(isset($_SESSION['cart'])){
    $cart=unserialize($_SESSION['cart']);
    }

    quindi se è un oggetto nulla altrimenti lo creo

    if(!is_object($cart)) $cart= new Cart();


    eseguo le funzioni che mi servono

    ...


    quindi passo alla sessione l'oggetto serializzato

    $_SESSION['cart']=serialize($cart);


    Cosi sembra funzionare.

    Ma.. teoricamente quando assegno un valore a $_SESSION non lo serializza già lui?
    e se mi dicono di non serializzare, significa non fare quello che in realtà ho fatto giusto?
    allora perchè cosi funziona e se non serializzo non funziona?

  8. #8
    Moderatore di Windows e software L'avatar di URANIO
    Registrato dal
    Dec 1999
    residenza
    Casalpusterlengo (LO)
    Messaggi
    1,290
    Serializzare significa in soldoni congelare lo stato dell'oggetto e trasformarlo in stringa.
    Quindi alla deserializzazione avrò un oggetto/array volorizzato come in precedenza.

    Se passo l'oggetto(la variabile) alla session lui si salva il puntatore all'oggetto(non so nemmeno se si possa fare) e quindi al ricaricamento della pagina non esiste più l'oggeto puntato dalla variabile in sessione.
    Così non va in errore perchè ti salvi TUTTO l'oggetto serializzato ed in lettura lo ricrei deserializzandolo.

    Io non so cosa stai facendo, ma mi puzza molto la parte in cui fai
    if(!is_object($cart)) $cart= new Cart();

    Sei sicuro che semplicemente non ricrei ogni volta un oggeto cart vuoto?

  9. #9
    Onestamente non so.
    Ma come faccio a dichiarare la classe Cart().

    La chiamo tramite la funzione new..

    Quindi new Cart().

    Se poi la assegno alla variabile $cart, questa, per quel che ne so diventa un oggetto.

    QUindi quando deserializzo $cart, chiedo se riconosce l'oggetto altrimento lo creo.

    Come potrei fare in alternativa?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.