Mirin webspace

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

21. 1. 2009 - Komentáře (4) PHP

Nové třídy v SPL pro PHP 5.3

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)

  1. v6ak - 21. 1. 2009 16:07

    "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'?".

  2. koubel - 21. 1. 2009 18:38

    [1] jo jo, přeformuloval jsem to na "Mezi novinkami jsou ještě další dvě třídy, které ..."

  3. David Grudl - 21. 1. 2009 21:32

    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";`

  4. Phil - 14. 6. 2009 20:42

    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.