Mirin webspace

Nejbohatší život má ten, kdo žije s minimem nároků

2. 12. 2008 PHP

Serializace objektů v PHP 5.3

Na webu Sebastiana Bergmanna, známého především z projektu PHPUnit a v neposlední řadě i přispěvatele do samotného PHP, vyšel zajímavý příspěvek o novince, která bude v PHP 5.3. Jedná se o metodu setAccessible() ve třídě ReflectionProperty, která je součástí Reflection API.

Jde o to, že tato metoda umožňuje přístup k private a protected atributům objektu nebo třídy přes metody ReflectionProperty::getValue() a ReflectionProperty::setValue(). Ve verzích < než 5.3 to možné nebylo. To umožní docela pěkně serializovat objekty se zachováním přístupu. Princip je ten, že pomocí Reflection API se dostaneme ke všem atributům (přes setAccessible() i k těm private,protected) třídy/objektu a ty si uložíme do pole. Celý kód zde uvádět nebudu, můžete se na něj podívat na stránce originálního blogpostu. Docela pěkná je ta deserializace, vytvoření objektu ze serializovaného pole bez použití volání konstruktoru je docela zajímavé.

 $object = unserialize(
   sprintf('O:%d:"%s":0:{}',strlen($className),$className)
 );

Jen drobnou poznámku na okraj. V PHP < 5.3 to jde udělat tak, že se objekt přetypuje na pole, při přetypovávání objektu na pole se ale PHP chová tak nějak divně, přidává tam různé znaky atd., toto řešení se tak v PHP 5.3 může označit jako hack. Popravdě řečeno i tyhle věci s Reflection mě přijdou dost podivné, sám jsem Reflection téměř nikdy nepoužil, ale jistě jsou oblasti, kdy se to hodí (třeba PHPUnit a různé MVC frameworky to asi využívat budou). Další věc je to, že třída se jmenuje ReflectionProperty místo třeba ReflectionAttribute, jak navrhuje Sebastian.

Ještě se sluší dodat, že k tomu, aby to takto fungovalo, potřebujete příslušný patch do zdrojáků větve PHP 5.3, který tam byl přidán teprve nedávno.


Komentáře (0)

Komentáře jsou uzavřeny.