Originariamente inviato da Santino83_02
Codice PHP:
<?php
class Object{
private $a;
public function __construct(){ echo "object created
"; $this->a = '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';