Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 28
  1. #1

    sessioni strane con le classi

    stavo provando questo script php che ho scritto

    <?
    class ProvaPers{
    private $numero;
    static private $istanza=null;

    private function __construct($num){
    $this->numero = $num;
    }

    public function __destruct(){
    print("chiamo la serializzazione");
    $_SESSION["ProvaPers"] = serialize(self::$istanza);
    }

    public function getNumero(){
    return($this->numero);
    }

    static public function istanza($num){
    if(isSet( $_SESSION["ProvaPers"])){
    print("deserializzo");
    self::$istanza = unserialize($_SESSION["ProvaPers"]);
    unset( $_SESSION["ProvaPers"] );
    $_SESSION = Array();
    }
    elseif (self::$istanza==null){
    print("creo");
    self::$istanza = new ProvaPers($num);
    }
    return self::$istanza;
    }
    }

    Session_start();

    $a = ProvaPers::istanza("a");
    $b = ProvaPers::istanza("b");

    print($a->getNumero());
    print($b->getNumero());
    ?>

    prova

    provandolo funziona poiché stampa "aa" ossia $a e $b puntano allo stesso oggetto. Ma andando su "prova2.php" che contiene lo stesso codice ad eccetto di:

    $c = ProvaPers::istanza("c");
    $d = ProvaPers::istanza("d");

    print($c->getNumero());
    print($d->getNumero());

    il risultato in output è "cc" come se le var di sessione non ci fossero.. sapete dirmi perché?
    Posso chiamare sistema operativo una cosa che per spegnere il pc devo cliccare su avvio?

  2. #2
    forse ho capito.. il __destruct non salva la var di sessione.. ma perché così sarebbe una cosa così comoda.. una bella classe univoca sempre
    Posso chiamare sistema operativo una cosa che per spegnere il pc devo cliccare su avvio?

  3. #3
    ha senso il numero nel costruttore ??? :master:


    poi devi passarti l' oggetto , questo viene ricreato non viene ricordato ... per passare l' oggetto usi il serialize, poi devi reincludere la classe e deserializzare l' oggetto
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  4. #4
    ha senso il numero nel costruttore ??? :master:
    ehm quale numero VVoVe:

    poi devi passarti l' oggetto , questo viene ricreato non viene ricordato ...
    per passare l' oggetto usi il serialize, poi devi reincludere la classe e deserializzare l' oggetto
    si si faccio così!
    Ho provato a serializzarlo all'esterno della classe e non nel __destruct. In questo modo funziona ma se uno se ne dimentica.. lì era molto comodo perché diveniva una classe auomatica nel riportarsi fra le varie pagine
    Posso chiamare sistema operativo una cosa che per spegnere il pc devo cliccare su avvio?

  5. #5
    aspe' ... ragioniamola ...


    public function __destruct(){
    $_SESSION["ProvaPers"] = serialize(self::$istanza);
    }

    cosi' serializzi una stringa all' interno della sesione ProvaPers ... mentre tu vuoi serializzare l' oggetto ProvaPers e il suo contenuto ... giusto ???


    in tal caso dovresti usare serialize( self ) che al 90% ti dara' errore ... e se capita questo 90% devi fare cosi':

    public function __destruct(){
    $a = &new ProvaPers(); // o &new self ma non so se lo accetta
    $_SESSION["ProvaPers"] = serialize( $a );
    }

    sto testando in 5.0.0 RC3 che fa un casino con le serializzazioni delle statiche, poi faccio prove in PHP 5.0.0 stabile e ti faccio sapere
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  6. #6
    comportamenti alquanto strani secondo me ... intanto non e' possibile serializzare la statica ma e' necessario, indispensabile assegnare questa ad una variabile, poi se la variabile e' statica non c'e' modo, o perlomeno non ci sono riuscito, di farla serializzare con il suo contenuto ... e infatti:

    codice:
    class StaticClass {
            static private $value = '';
            static public function setValue( $value ) {
                    StaticClass::$value = $value;
            }
            static public function getValue() {
                    return StaticClass::$value;
            }
            function __destruct() {
                    echo serialize( $this );
            }
    }
    $a = &new StaticClass; // se non la assegno il __destruct non va
    $a->setValue( "prova" );
    
    // elimino $a e metto una linea per dividere le classi
    unset( $a );
    echo "<hr />";
    
    class StaticClass2 {
            private $value = '';
            public function setValue( $value ) {
                    $this->value = $value;
            }
            public function getValue() {
                    return $this->value;
            }
            function __destruct() {
                    echo serialize( $this );
            }
    }
    $a = &new StaticClass2;
    $a->setValue( "prova" );

    risultato:
    codice:
    O:11:"StaticClass":0:{}
    -----------------------
    O:12:"StaticClass2":1:{s:19:"StaticClass2value";s:5:"prova";}
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  7. #7
    self non da errore ma rimane tutto come prima.. l'altra opzione non va, crea un loop infinito. Ho la mente fusa, proverò dopo
    Posso chiamare sistema operativo una cosa che per spegnere il pc devo cliccare su avvio?

  8. #8
    anzi creo il metodo serializza, chiamo quello e non metto niente nel __destruct. Se funziona tutto.. nel destruct non ce puoi mettere la serializzazione! Sarà perché viene chiamata dopo la dereferenziazione dell'oggetto? bah
    Posso chiamare sistema operativo una cosa che per spegnere il pc devo cliccare su avvio?

  9. #9
    no no la statica si può serializzare. Se serializzo la classe dopo averla creata

    tipo:

    $_SESSION["ProvaPers"] = serialize( $a );

    e richiamo la classe da un'altra pagina, anche le sue var statiche vengono riprese.
    Posso chiamare sistema operativo una cosa che per spegnere il pc devo cliccare su avvio?

  10. #10
    prova.php

    <?
    class ProvaPers{
    private $numero;
    static private $istanza=null;

    private function __construct($num){
    $this->numero = $num;
    }

    public function __destruct(){
    print("chiamo la serializzazione");
    $_SESSION["ProvaPers"] = serialize( self );
    }

    public function getNumero(){
    return($this->numero);
    }

    static public function istanza($num){
    if(isSet( $_SESSION["ProvaPers"])){
    print("deserializzo");
    self::$istanza = unserialize($_SESSION["ProvaPers"]);
    unset( $_SESSION["ProvaPers"] );
    $_SESSION = Array();
    }
    elseif (self::$istanza==null){
    print("creo");
    self::$istanza = new ProvaPers($num);
    }
    return self::$istanza;
    }
    }

    Session_start();

    $a = ProvaPers::istanza("a");
    $b = ProvaPers::istanza("b");


    print($a->getNumero());
    print($b->getNumero());
    ?>

    prova

    _____________________________________________--


    prova2.php

    class ProvaPers{
    private $numero;
    static private $istanza=null;

    private function __construct($num){
    $this->numero = $num;
    }

    public function __destruct(){
    print("chiamo la serializzazione");
    $_SESSION["ProvaPers"] = serialize( self );
    }

    public function getNumero(){
    return($this->numero);
    }

    static public function istanza($num){
    if(isSet( $_SESSION["ProvaPers"])){
    print("deserializzo");
    self::$istanza = unserialize($_SESSION["ProvaPers"]);
    unset( $_SESSION["ProvaPers"] );
    $_SESSION = Array();
    }
    elseif (self::$istanza==null){
    print("creo");
    self::$istanza = new ProvaPers($num);
    }
    return self::$istanza;
    }
    }

    Session_start();

    // unserializzo la sessione
    $c = ProvaPers::istanza("c");
    print($c->getNumero());

    $d = ProvaPers::istanza("d");
    print($d->getNumero());
    if(isSet( $_SESSION["ProvaPers"])) print("prova va");
    ?>
    prova

    __________________________________
    X TESTARE: www.ht-mnt.it/1/prova.php


    si capisce dal codice CHE SE LA SERIALIZZAZIONE AVVIENE in prova2.php deve essere visualizzato "PROVA VA" cosa che non accade. Le mie conclusioni sono che in destruct la serializzazione non va..
    Posso chiamare sistema operativo una cosa che per spegnere il pc devo cliccare su avvio?

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.