<h2>PHP pro pokroΦilΘ - znovu t°φdy a objekty</h2>
<p id='prepend'>V tomto Φlßnku o t°φdßch a objektech si ukß₧eme dalÜφ zajφmavΘ mo₧nosti p°i prßci s OOP v PHP. Budeme se zab²vat vyu₧itφm takzvanΘ serializace a magick²ch funkcφ __sleep() a __wakeup() - vytvo°φme instanci t°φdy, ulo₧φme ji do souboru a nakonec cel² objekt p°edßme v session.</p>
<h3>Serializace a unserializace</h3>
<p>VÜe zajiÜ¥ujφ funkce <code>serialize()</code> a <code>unserialize()</code>, kterΘ p°evedou do takzvanΘho byte °et∞zce prom∞nnΘ objektu. Proces tohoto "p°evodu" se naz²vß serializace a opaΦn² postup unserializace. Na vstupu funkce <code>serialize()</code> je objekt a na v²stupu ji₧ zmi≥ovan² byte °et∞zec, u funkce <code>unserialize()</code> je tomu naopak.</p>
<p>Pro dalÜφ experimentovßnφ si nadefinujeme pokusnou t°φdu do souboru "trida.php" se kterou budeme dßle pracovat:</p>
<div class='sample'>
<?
<br /><span class='comment'>/*
<br />Soubor trida.php ve kterΘm je definice pokusnΘ t°φdy
<br />*/</span>
<br />class clsTrida {
<br /> <span class='comment'>//pomocφ konstruktoru nastavφme hodnoty vlastnostφ</span>
<br /> function clsTrida($vl1, $vl2) {
<br /> $this->vlastnost1=$vl1;
<br /> $this->vlastnost1=$vl2;
<br /> }
<br /> <span class='comment'>//funkce vypis() vypφÜe hodnoty obou vlastnostφ</span>
<p>V souboru s unserializacφ se ji₧ nevytvß°φ ₧ßdnß instance, proto₧e unserializovan² objekt je schopen sßm poznat svoji t°φdu. Ta ale ve skriptu definovßna b²t musφ.</p>
<div class='sample'>
<?
<br /><span class='comment'>/*
<br />Soubor "b.php"
<br />V druhΘm souboru otev°eme soubor "data", kde je serializovan² objekt a unserializujeme ho
<br />*/</span>
<br /><span class='comment'>//naincludujeme soubor s pokusnou t°φdou</span>
<br />include ("trida.php");
<br /><span class='comment'>//otev°enφ souboru a p°eΦtenφ jeho obsahu</span>
<br /><span class='comment'>//nechßme si vlastnosti objektu vypsat, abyste vid∞li, ₧e ulo₧enφ do souboru "p°e₧ili"</span>
<br />$UnserializovanyObjekt->Vypis();
<br />?>
</div>
<p>P°edßnφ objektu pomocφ session je v podstat∞ stejnΘ jako p°i uklßdßnφ do souboru, jen zde mφsto funkcφ pro ulo₧enφ souboru pou₧ijeme funkce pro p°edßvßnφ session:</p>
<div class='sample'>
<?
<br /><span class='comment'>/*
<br />Soubor "sesstrida1.php"
<br />*/</span>
<br />session_start(); //nastartovani session
<br /><span class='comment'>//naincludujeme soubor s pokusnou t°φdou</span>
<br /><span class='comment'>//op∞t si vypφÜeme hodnoty obou vlastnostφ</span>
<br />$UnserializovanyObjekt->vypis();
<br />?>
</div>
<h3>MagickΘ funkce __sleep() and __wakeup()</h3>
<p>P°i (un)serializaci mohou b²t velmi u₧iteΦnΘ "magickΘ" funkce <code>__sleep()</code> a <code>__wakeup()</code>, kterΘ se umis¥ujφ do definice t°φdy. Funkce <code>__sleep()</code> se spustφ na zaΦßtku serializace. M∙₧eme do nφ vlo₧it k≤d nap°φklad pro ukonΦenφ spojenφ s databßzφ. D∙le₧itΘ je, aby funkce <code>__sleep()</code> vrßtila pole, kterΘ obsahuje prom∞nnΘ objektu, ze kter²ch se vytvo°φ byte °et∞zec. Naproti tomu funkce <code>__wakeup()</code> se spustφ na zaΦßtku unserializace. Lze ji vyu₧φt nap°φklad pro obnovenφ spojenφ s databßzφ.</p>
<p>V nßsledujφcφm p°φkladu si vytvo°φme t°φdu, kterß si pamatuje datum svΘ serializace a p°i unserializaci tuto hodnotu vypφÜe. Byte °et∞zec v tomto p°φkladu budeme uklßdat do souboru. Funkce <code>get_object_vars()</code> byla popsßna <a href='http://interval.cz/clanek.asp?article=3183' title='Heller, Petr: PHP pro pokroΦilΘ - pracujeme s t°φdami a objekty'>v p°edchozφm Φlßnku</a>.</p>
<div class='sample'>
<?
<br /><span class='comment'>/*</span>
<br /><span class='comment'>Soubor trida.php ve kterΘm je definice pokusnΘ t°φdy</span>
<br /><span class='comment'>*/</span>
<br />class clsTrida {
<br />
<br /> <span class='comment'>//funkce vypis() vypφÜe hodnoty obou vlastnostφ</span>
<p>V²Üe uveden² p°φklad je pouze jednoduchou ukßzkou magick²ch funkcφ a velkΘ praktickΘ vyu₧itφ asi nemß. V nßsledujφcφm p°φkladu si tedy vytvo°φme t°φdu, kterß vyu₧φvß databßzi. Funkce <code>__sleep()</code> v tomto p°φpad∞ spojenφ s nφ ukonΦφ a vrßtφ ·daje pot°ebnΘ k p°ihlßÜenφ do databßze, funkce <code>__wakeup()</code> spojenφ op∞tovn∞ navß₧e. V²hody tohoto postupu jsou z°ejmΘ.</p>
<div class='sample'>
<?
<br /><span class='comment'>/*</span>
<br /><span class='comment'>Soubor trida.php ve kterΘm je definice pokusnΘ t°φdy</span>
<br /><span class='comment'>//vypφÜeme obsah tabulky</span>
<br />$UnserializovanyObjekt->Vypis();
<br />?>
</div>
<p>JeÜt∞ se musφm zmφnit o jednom bezpeΦnostnφm nedostatku zmφn∞nΘho p°φkladu. Pokud p°edßvßte byte °et∞zec v session, data jsou zde v nezaÜifrovanΘ form∞, tak₧e je m∙₧e p°φpadn² ·toΦnφk velmi jednoduÜe odchytit a pokud znß strukturu byte °et∞zce (kterß nenφ nijak slo₧itß, zkuste si otev°φt soubor, do kterΘho uklßdßte byte °et∞zec, v libovolnΘm textovΘm editoru), nebude problΘm si je p°eΦφst a dostat se tak do naÜφ databßze. Podmφnkou je tedy pou₧itφ nap°φklad zabezpeΦenΘho protokolu SSL.</p>
<p>VÜechny <a href='podklady/heller/849/serializace.zip'>p°φklady z Φlßnku</a> si m∙₧ete stßhnout. A₧ na p°φklad s databßzφ, kde si musφte upravit p°ihlaÜovacφ ·daje, budou fungovat bez problΘm∙.</p>
<li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3280' title='(36 komentß°∙)'>Interval.cz a jeho Φtenß°i</a></li>
<li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3296' title='(30 komentß°∙)'>PHP pro pokroΦilΘ - znovu t°φdy a objekty</a></li>
<li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3301' title='(24 komentß°∙)'>Kompletnφ pr∙vodce XSLT - ·vod do problematiky</a></li>
<li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3276' title='(21 komentß°∙)'>Webovß grafika podle TomßÜe BarΦφka</a></li>