Jdi na navigaci předmětu

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()
    • __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
$product = new Product('Mitsubishi Lancer', 320000, 0.21);
print_r(serialize($product));
Výsledek

O:7:"Product":3:{s:4:"name";s:17:"Mitsubishi Lancer";s:5:"price";d:320000;s:7:"vatRate";d:0.21;}

JSON serializace

  • využívá formátu JSON
  • bezpečnější oproti PHP serializaci
  • snadno zpracovatelné napříč platformami a programovacími jazyky
  • json_encode()
  • json_decode()
    • převod JSON ⇒ PHP data
    • JSON objekt se může převést na stdClass i 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
  • rozhraní JsonSerializable umožň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
}

  1. I když moderní relační databáze zahrnují i objektové prvky.