__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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
Class1::__set_state(array('var1' => 'value', 'var2' => 'value', ));
?>


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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
<?php

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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
foobar

« Lees de omschrijving en reacties

Inhoudsopgave

  1. Inleiding
  2. __construct
  3. __destruct
  4. __sleep & __wakeup
  5. __toString
  6. __clone
  7. __autoload
  8. __set_state
  9. __get, __set, __call, __isset, __unset
  10. Links

PHP tutorial opties

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.