Antakaapa vinkkejä siitä, mistä voisi oppia nopeasti käyttämään ja tekemään olioita PHP:llä. Pitäisi tehdä hieman N-ary tree:n tyyppinen puu, jossa lasten lukumäärä voi kuitenkin vaihdella, eli puurakenne ja linkitetty lista. Oliot ovat kyllä tuttuja Javan puolelta, mutta PHP:llä ei ole tullut vastaan. Vai onkohan XML-tiedoston parsimiseen jokin helpompi tapa?
Voitko käyttää DOM rajapintaa XML:n lukemiseen. Sehän on ainakin PHP:n versiossa 5 aika hyvällä mallilla. Itse tehtynä tuo kuvaamasi tietorakenne olisi aika lähellä XML:ä, jos lasten määrä voi vaihdella solmusta toiseen.
Voin käyttää, mutta kun ei taidot vielä riitä. Miten tuo DOM toimii?
<?php /* Luodaan uusi dokumentti */ $sivu = new DOMDocument("1.0", "UTF-8"); /* Ladataan validi xml-tiedosto */ $sivu->load("polku/xml/tiedostoon.xml"); /* Haetaan kaikki linkkisolmut */ $linkit = $sivu->getElementsByTagName("a"); /* Käydään läpi jokainen haettu solmu */ for($i = 0; $i < $linkit->length; ++$i){ /* Tulostetaan solmu, jos sen class attribuutti on 'menu' */ if($linkit->item($i)->getAttribute("class") == "menu"){ echo $linkit->item($i)->textContent . "<br />"; } }
Tässä on vielä hieman yleistä juttua, jota käsittääkseni kaipasit:
PHP:n oliot ovat syntaksiltaan ja toiminnaltaan erittäin lähellä Javan olioita: näkyvyydet (public jne.), extends, implements, abstract ja final sekä metodien ylikirjoitus toimivat samalla tavalla. Olioon viittaavat muuttujat ovat aina viittauksia, eli kopiointi täytyy tehdä eksplisiittisesti.
Syntaksi on toki PHP:tä, eli käytetään $-merkkejä ja function-sanoja. Pari muuta eroa Javaan: Instanssin jäseniin viitataan muodossa $olio->jasen, omiinkin viitatessa $this vaaditaan aina. Staattisiin viitataan Luokka::$jasen tai luokan sisällä self::$jasen. Lisäksi "loogisesti" parent-sanan kanssa käytetäänkin aina kaksoispisteitä, eli esim. Javasta tuttu super.funktio() onkin parent::funktio().
<?php class Piste { private $i; public $x = 10; public $y = 12; private static $n = 0; public function __construct($x = 10) { $this->x = $x; $this->i = self::$n; self::$n += 1; } public function printtaa() { echo "$this->i: ($this->x, $this->y)\n"; } } $p = new Piste(); $p->printtaa(); $p2 = new Piste(23); $p2->printtaa(); $p2->y = 15; $p2->printtaa();
Onneksi olkoon, osaat nyt varmaankin käyttää olioita PHP:llä!
Dom vaikuttaa kätevältä ja oliot helppokäyttöisiltä. Mitenkä DOMilla voidaan katsoa, että jos mulla on vaikka päivämäärä-otsikko -pareja, niin voisin käsitellä päivämääriä erikseen ja otsikoita erikseen? Kuhunkin päivämäärään voi liittyä käsittelemässäni tapauksessa monia otsikoita tai ei välttämättä yhtään.
Olisiko rakenne silloin tällainen?
... <ul> <li>Otsikko 1 <ul> <li>pvm 1</li> <li>pvm 2</li> </ul> </li> <li>Otsikko 2 <ul> <li>pvm 1</li> </ul> </li> </ul> ...
Aihe on jo aika vanha, joten et voi enää vastata siihen.