__set_state
De magische functie __set_state is een iets ingewikkelder verhaal dan de andere magic methods. In PHP heb je de functie var_export(). Deze functie is vergelijkbaar met var_dump() (en print_r()), maar heeft als verschil dat deze PHP code uitspuugt die je dus weer kan hergebruiken. Het probleem is echter dat een object een heel complex datatype is en PHP niet precies snapt hoe hij dit moet doen met var_export(). De oplossing is __set_state.
Als je een object exporteert met var_export(), dan zal PHP dat voortaan in het volgende formaat teruggeven:
Zoals je ziet is dit parse-bare code. Als je deze code uitvoert, dan zal namelijk de statische functie __set_state() van klasse Class1 worden uitgevoerd. De array binnen __set_state() bevat de namen van variabelen met hun waardes. Als je nu bovenstaande code weer uitvoert in PHP, dan werkt het gewoon en wordt de functie __set_state() aangeroepen. Als je deze gedefinieerd hebt binnen de klasse (in dit geval Class1), dan heb je dus geen errors. Je kunt dan dus ook eval() gebruiken op een var_export() zonder te hoeven vrezen dat er iets mis gaat.
Hier een voorbeeld van hoe je Class1 zou kunnen definiƫren:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Class1 {
public $var1, $var2;
public function __construct() {
// doe iets
}
// leuke functie hier en daar
public static function __set_state(array $vars) { // kan ook gewoon __set_state($vars)
$instance = new Class1;
$instance->var1 = $vars['var1'];
$instance->var2 = $vars['var2'];
return $instance;
}
}
$a = new Class1;
$a->var1 = 'foo';
$a->var2 = 'bar';
$export = var_export($a, true);
eval('$b=' . $export . ';');
echo $b->var1 . $b->var2;
?>
Bovenstaand script zal als output hebben:
Inhoudsopgave
- Inleiding
- __construct
- __destruct
- __sleep & __wakeup
- __toString
- __clone
- __autoload
- __set_state
- __get, __set, __call, __isset, __unset
- Links