Jednou z věcí, která se také v nadcházející verzi PHP (5.3) objeví jsou nové třídy v rozšíření SPL. Jedná se o třídy, které implementují některé běžně používané datové struktury jako jako je fronta apod. Prozatím rozšíření SPL obsahovalo poměrně bohatou sadu iterátorů, objektové wrappery na práci s poli a některé výjimky a nyní tedy přibudou další struktury. PHP samo o sobě žádné prostředky na práci s věcmi jako fronta, spojový seznam apod. neposkytovalo. Museli jste si vystačit s polem a objekty a napsat si to sami. Nově se jedná zejména o tyto třídy
- SplDoublyLinkedList - dvojitý spojový seznam
- SplStack - zásobník
- SplQueue (SplPriorityQueue) - fronta a fronta s prioritami
- SplHeap (SplMinHeap, SplMaxHeap) - abstraktní halda (je to vlastně strom) a její potomci pro haldu vzestupnou a sestupnou.
Podrobnosti tady uvádět nebudu, kdo potřebuje, najde podrobnosti třeba na stránkách wikipedie - Category:Data_structures.
V podstatě lze říci, že tyto struktury by se daly implementovat v pohodě v samotném PHP ale jejich implementace v core přináší asi tyto výhody.
- Každý si to po svém udělal trochu jinak, teď to dostane jednotnou fasádu
- Pokud to jako vývojář použijete, usnadníte tak práci těm, co zdědí Vaši práci po Vás
- Napsané v C-čku to bude určitě rychlejší.
Mezi novinkami jsou ještě další dvě třídy, které do skupiny datových struktur nepatří. Jedná se o SplObjectStorage a SplFixedArray.
SplObjectStorage jak název napovídá, je kontejner na objekty, kde objekty mohou sloužit jako klíče v mapě nebo lze kontejner použít jako množinu s porovnávací funkcionalitou.
// Map $dict = new SplObjectStorage; $dict[$obj1] = $info1; $dict[$obj2] = $info2; var_dump($dict[$obj1]); // $info1 // Set $set = new SplObjectStorage; $set->attach($obj1); var_dump($set->contains($obj1)); // True
Výhoda oproti použití klasického php pole by měla být především v tom, že se nepoužívají md5 hashe a tak by to mělo být celé rychlejší - viz blog autora Etienna Kneusseho.
SplFixedArray je obdoba klasického Céčkového pole. Je to pole s pevnou předem danou délkou a pouze numerickými indexy. Hlavní výhoda oproti klasickému PHP poli bude opět zejména rychlost. Použití je obdobné jako u normálního pole.
$a = new SplFixedArray(5); $a[0] = "a"; $a[1] = "c"; $a[2] = "d"; $a[3] = "e"; $a[4] = "f"; foreach ($a as $k => $v) { echo "$k => $v\n"; }
Komentáře (4)
"Mezi novinkami jsou ještě dvě výjimky, které do skupiny datových struktur nepatří. Jedná se o SplObjectStorage a SplFixedArray."
To je trošku zvláštně vajádřeno. Nejdřív jsem si říkal "K čemu to bude?" a "Jaktože ten název nekončí na 'Exception'?".
[1] jo jo, přeformuloval jsem to na "Mezi novinkami jsou ještě další dvě třídy, které ..."
SplObjectStorage existuje v PHP od verze 5.1, ale všechny zdroje ji dlouho úspěšně tajily.
SplFixedArray by mohla být příjemná věc, kdyby to byla nativní jazyková konstrukce. Bohužel kvůli určitým omezením třeba nebude fungovat `$a[2][4] = "d";`
Ive done some benchmarks on SPLFixedArray just to see how much quicker it is.
Reads are about the same but writes tend to be about 40% quicker
Komentáře jsou uzavřeny.