Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924

    unserialize di proprietà static

    sto provando a serializzare/deserializzare proprietà statiche di una classe usando i metodi __wakeup() e __sleep() con PHP 5.2.5

    secondo quanto ho letto
    la funzione __sleep si attiva subito prima della serializzazione
    la funzione __wakeup si attiva subito prima della deserializzazione

    serialize non funziona però con le proprietà statiche, e sto quindi utilizzando un private array (staticvars) in cui inserisco la var4 (che è static) e il suo valore

    questo è il codice che sto usando

    codice:
    <?
    class classe {
    
        public $var1;
        private $var2;
        protected $var3;
        public static $var4;
        
        private $staticvars = array();
        
        function __construct() {
            $this->var1 = "valore uno";    
            $this->var2 = "valore due";    
            $this->var3 = "valore tre";    
            classe::$var4 = "valore quattro";
        }
        
        public function __sleep() {
            $vars = get_class_vars(get_class($this));
    
            foreach($vars as $key => $val) {
                
                if (!empty($val)) {
                    $this->staticvars[$key] = $val;
                }
            }
            return array_keys(get_object_vars($this));
        }
        
        public function __wakeup() {
            
            foreach ($this->staticvars as $key => $val) {
                $prop = new ReflectionProperty(get_class($this), $key);
                $prop->setValue(get_class($this), $val);
            }
            
            $this->staticvars = array();
        }   
    
    }
    ?>
    
    Serialize
    <pre>
    <?php
    $cl = new classe();
    $s_cl = serialize($cl);
    file_put_contents("test.txt", $s_cl);
    echo $s_cl;
    ?>
    </pre>
    
    Unserialize
    <?php
    $sc = file_get_contents("test.txt");
    $unscont = unserialize($sc);
    var_dump($unscont);
    ?>
    Ora il serialize sembra funzioni correttamente: se apro il file "test.txt" dove ho inserito la stringa serializzata vi trovo tutte le proprietà (eccetto la varibile static) e l'array che contiene la copia della proprietà statica var4 (vedi allegato)

    Tuttavia quando eseguo l'unserialize l'array staticvars è vuoto: da cosa potrebbe dipendere?

    Notate inoltre come nel file di testo appaiano dei simboli speciali (nul) tra un valore e l'altro... è normale?




    Grazie a tutti
    Immagini allegate Immagini allegate
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  2. #2
    Sicuro che setValue setti funzioni statiche?
    A me sembra che lavori solo sulle classiche.

  3. #3
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    ok, però io mi domando come mai all'unserialize non valorizzi correttamente l'array staticvars che non è affatto statico e che contiene il nome della variabile statica come key e il suo valore come value
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  4. #4
    Se si toglie

    Codice PHP:
    $this->staticvars = array(); 
    funziona.

    Non ho mai utilizzato __sleep() /__wakeup()

    ma ad occhio così sovrascrivi l'array.


    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  5. #5
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    Originariamente inviato da whisher
    Se si toglie

    Codice PHP:
    $this->staticvars = array(); 
    funziona non ho mai utilizzato __sleep() /__wakeup()

    ma ad occhio così sovrascrivi l'array.



    hai ragione... ero completamente concentrato sui metodi magici e non mi sono accorto che il problema era di tutt'altra natura.

    grazie ad entrambi
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

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.