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';