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

    Problema con __sleep e __wakeup

    Sto leggendo una guida sulla programmazione ad oggetti di PHP e non solo non riesco a capire i metodi magici __sleep e __wakeup ma non riesco neppure a vederli in funzione perché lo script della guida mi da errore.

    Chi mi può dare una mano?

    Codice PHP:
    class MyClass {
    protected 
    $link;
    public 
    $host$username$password$db;
    public function 
    __construct($host$username$password$db)
    {
    $this->host $host;
    $this->username $username;
    $this->password $password;
    $this->db $db;
    // connessione al database
    $this->connect();
    }
    private function 
    connect() {
    // connessione ad un database
    $this->link mysql_connect($this->host$this->username$this->password);
    mysql_select_db($this->db$this->link);
    }
    public function 
    __sleep() {
    // serializzazione di 4 proprietà
    return array('host''username''password''db');
    }
    // ripristino della connessione al database
    public function __wakeup() {
    $this->connect();
    }
    }
    $obj1 = new MyClass('host''username''password''db');
    $obj1_serialized serialize($obj1);
    // successivamente...
    $obj2 unserialize($obj1_serialized);
    // stampa "host"
    echo $obj2->host
    Grazie amici

    P.S.: Premetto che non ho ancora letto la guida su MySQL e volevo leggerla dopo a questa quindi potrebbe essere un questione tendente al mio ignorantesco ignorantismo...
    Chi non crede in una cultura libera forse non
    ha mai provato un forum ma chi ha provato
    un forum e non crede in una cultura libera
    allora non é mai stato utile alla
    cultura altrui.

  2. #2
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    No, mysql non c'entra niente.
    Il punto è un altro: hai presente il concetto di serializzazione?

  3. #3
    L'unica cosa che so l'ho trovata su google quando cercado di districare il problema ed é raggiusa in questo pensiero:

    Serialize “traduce” in stringa il contenuto dell’array così da poterlo salvare in un campo di una tabella, successivamente, per il recupero dei dati e la “ritrasformazione” in array, bisogna utilizzare la funzione unserialize().
    Chi non crede in una cultura libera forse non
    ha mai provato un forum ma chi ha provato
    un forum e non crede in una cultura libera
    allora non é mai stato utile alla
    cultura altrui.

  4. #4
    Codice PHP:
    <?php

    class Object{
        private 
    $a;
        public function 
    __construct(){ echo "object created
    "
    $this->'object ready'; }
        
        public function 
    test(){ echo $this->a.'
    '
    ; }
    }

    class 
    MyClass{

        
    // PROPRIETÀ:
        
    private $a;
        private 
    $b;
        private 
    $name;
        private 
    $pippo;
        
        public function 
    __construct(){
            
    $this->pippo = new Object();    
        }
        
        public function 
    __wakeup() { 
            echo 
    "mi sono svegliato, posso riattivarmi ora
    "
    ;
        } 
        
        public function 
    __call($method,$args){
            
    $method strtolower(str_replace('set','',$method));
            
    $this->{$method} = $args;
        }
     }

     
    $obj1 = new MyClass();    
     
    $obj1->setA(10);            
     
    $obj1->setB(20);          
     
    $obj1->setName('prova di classe');      
        
        
    var_dump($obj1);
        echo 
    "
    "
    ;
        
        
    $serialized serialize($obj1);
        
        echo 
    $serialized.'
    '
    ;
        
        
    $b unserialize($serialized);
        
        
    var_dump($b);
        
    ?>
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  5. #5
    Non riesco a capire questo pezzo:
    $obj1->setA(10);
    $obj1->setB(20);
    non capisco perché qui sotto di mettono delle parentesi graffe:
    $this->{$method} = $args;
    non capisco perché si chiami una funzione setName non definita nella classe:
    $obj1->setName('prova di classe');
    e quindi non riesco a capire questi benedetti __sleep e __wakeup.
    Chi non crede in una cultura libera forse non
    ha mai provato un forum ma chi ha provato
    un forum e non crede in una cultura libera
    allora non é mai stato utile alla
    cultura altrui.

  6. #6
    Originariamente inviato da Santino83_02
    Codice PHP:
    <?php

    class Object{
        private 
    $a;
        public function 
    __construct(){ echo "object created
    "
    $this->'object ready'; }
        
        public function 
    test(){ echo $this->a.'
    '
    ; }
    }

    class 
    MyClass{

        
    // PROPRIETÀ:
        
    private $a;
        private 
    $b;
        private 
    $name;
        private 
    $pippo;
        
        public function 
    __construct(){
            
    $this->pippo = new Object();    
        }
        
        public function 
    __wakeup() { 
            echo 
    "mi sono svegliato, posso riattivarmi ora
    "
    ;
        } 
        
        public function 
    __call($method,$args){
            
    $method strtolower(str_replace('set','',$method));
            
    $this->{$method} = $args;
        }
     }

     
    $obj1 = new MyClass();    
     
    $obj1->setA(10);            
     
    $obj1->setB(20);          
     
    $obj1->setName('prova di classe');      
        
        
    var_dump($obj1);
        echo 
    "
    "
    ;
        
        
    $serialized serialize($obj1);
        
        echo 
    $serialized.'
    '
    ;
        
        
    $b unserialize($serialized);
        
        
    var_dump($b);
        
    ?>
    Vedi il metodo magico __call? Questo intercetta le chiamate a metodi inesistenti nella classe.
    Mettiamo il caso che chiamo il metodo setName. Questo non esiste e senza una corretta gestione riceveresti un errore. Il metodo magico __call intercetta la chiamata, e PHP gli passa come argomento una stringa con il metodo che vuoi chiamare, e glia argomenti che gli hai passato.

    es:
    Codice PHP:
    $obj1->setName('prova di classe'); 
    Ora il metodo __call tramite l'istruzione:

    Codice PHP:
    $method strtolower(str_replace('set','',$method)); 
    assegna alla variabile $method la stringa 'name', questi sono i passi:

    setName -> setname -> name;

    dopodiché, tramite l'istruzione

    Codice PHP:
    $this->{$method} = $args
    assegna alla proprietà {$method}, in questo caso "name", il valore di 'prova di classe';

    $this->{$method} = $args; interpretalo come $this->name = 'prova di classe';

  7. #7
    ora mi é tutto più chiaro, grazie Santino83_02!!!! sei er meglio del meglio!!!
    Chi non crede in una cultura libera forse non
    ha mai provato un forum ma chi ha provato
    un forum e non crede in una cultura libera
    allora non é mai stato utile alla
    cultura altrui.

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.