O:7:"Product":3:{s:4:"name";s:17:"Mitsubishi Lancer";s:5:"price";d:320000;s:7:"vatRate";d:0.21;}
Serializace a deserializace dat
- uložení objektů mimo PHP
- relační databáze[1]
- kešovací systémy (Memcached, Redis aj.)
- umožňuje objekty později obnovit, a to i na jiném aplikačním serveru
Vzorová třída
Níže uvedená třída je použita v příkladech na této stránce
class Product {
public function __construct(
// vlastnosti jsou public pouze pro demonstrační účely
public string $name,
public float $price,
public float $vatRate
) { }
}PHP serializace
- výchozí druh serializace
- používá PHP specifický formát ⇒ komplikace pro datové analytiky
- není-li určeno jinak, serializace zahrnuje privátní i veřejné vlastnosti třídy
- private vlastnosti jsou vyznačeny zahrnutím názvu třídy oddělené znakem NULL
- public vlastnosti jsou označeny pouze svým názvem
- volá metody dle druhu třídy ⇒ riziko vzniku zranitelnosti typu Remote Code Execution
serialize()unserialize()- rozhraní
Serializable - magické metody
__serialize()- vrací reprezentaci třídy jako pole
- slouží ke stanovení dat, na které se třída má serializovat (př. přeskočení určitých vlastností, apod.)
__unserialize()- inverzní funkce k
__serialize()
- inverzní funkce k
__sleep()- volaná před serializací
- slouží k vzdání-se zdrojů, které třída má a po serializaci je nebude potřebovat
- databázové spojení, dočasné soubory na disku, …
__wakeup()- inverzní funkce k
__sleep() - slouží k realokování zdrojů, kterých se předtím třída vzdala
- inverzní funkce k
$product = new Product('Mitsubishi Lancer', 320000, 0.21);
print_r(serialize($product));Výsledek
JSON serializace
- využívá formátu JSON
- bezpečnější oproti PHP serializaci
- snadno zpracovatelné napříč platformami a programovacími jazyky
json_encode()- převod PHP data ⇒ JSON
- možné specifikovat příznaky (pro úplný seznam viz dokumentace):
JSON_PRETTY_PRINT: lidsky čitelný JSONJSON_FORCE_OBJECT: i číselně indexovaná pole jsou serializovaná jako objektyJSON_THROW_ON_ERROR: v případě chyby při serializaci vyhodí výjimku
json_decode()- převod JSON ⇒ PHP data
- JSON objekt se může převést na
stdClassi asociativní pole (určeno atributem, výchozí =stdClass) - asociativní pole nemusí být jednoznačné (prázdné prvky)
json_validate()- kontrola, zda je zadaný JSON dokument syntakticky validní
json_last_error(),json_last_error_msg(): získání poslední chyby, která nevyvolala výjimku- Upozornění: ve výchozím stavu jsou chyby k dispozici pouze v těchto funkcích, vyhození výjimky je nutné si vyžádat příznakem
JSON_THROW_ON_ERROR
- Upozornění: ve výchozím stavu jsou chyby k dispozici pouze v těchto funkcích, vyhození výjimky je nutné si vyžádat příznakem
- rozhraní
JsonSerializableumožňuje objektu specifikovat, jaká data se mají serializovat- výchozí: serializují se pouze public vlastnosti
$product = new Product('Mitsubishi Lancer', 320000, 0.21);
print_r(json_encode($product, JSON_PRETTY_PRINT));Výsledek
{
"name": "Mitsubishi Lancer",
"price": 320000,
"vatRate": 0.21
}- I když moderní relační databáze zahrnují i objektové prvky. ↩