Luokat ja oliot - Demo 4
Tehdään luokkia elokuvatietokantaa varten ja harjoitellaan niiden käyttöä.
Luokan luominen
Tehdään elokuva-luokka, joka sisältää tietoa tietystä elokuvasta.
- Luo uusi PHP-tiedosto nimelle elokuva.class.php.
- Tee tiedostoon luokka nimeltä elokuva.
- Laita luokalle attribuuteiksi (kaikki private) seuraavat:
- $nimi
- $vuosi
- $laji
- $ohjaaja
- $nayttelijat (taulukko)
- Tee luokalle konstruktori,jossa sijoitetaan parametrina tuotavat arvot attribuutteihin nimi, vuosi, laji ja ohjaaja.
- Tee luokalle destruktori, jossa sijoitetaan kaikkien luokan attribuuttien arvoiksi
NULL. - Tee luokalle seuraavat metodit (kaikki public), joissa haetaan luokan attribuutin arvo:
- hae_nimi()
- hae_vuosi()
- hae_laji()
- hae_ohjaaja()
- hae_nayttelijat()
public function hae_nimi() { return $this->nimi; } - Tee luokalle seuraavat metodit (kaikki public), joissa asetetaan luokan attribuutille arvo:
- aseta_nimi($arvo)
- aseta_vuosi($arvo)
- aseta_laji($arvo)
- aseta_ohjaaja($arvo)
public function aseta_nimi($arvo) { $this->nimi = $arvo; } - Tee luokalle metodi lisaa_nayttelija($arvo), joka lisää $nayttelijat-taulukkoon parametrina tuotavan näyttelijän nimen. Lisäykseen voit käyttää esimerkiksi array_push-funktiota. Tarkista lisätessä, ettei kyseistä näyttelijää ole jo taulukossa. Tarkistuksessa kannattaa käydä taulukko läpi foreach-rakenteella.
- Tee luokalle metodi poista_nayttelija($arvo), joka poistaa $nayttelijat-taulukosta
parametrina tuotavan näyttelijän nimen. Poistoon voit käyttää
unset-funktiota. Poistaessa kannattaa käydä taulukko läpi
foreach-rakenteella ja selvittää jokaisella kerralla taulukon alkion arvon
lisäksi myös alkion avain, jotta tiedät mistä taulukon indeksistä poisto tulee tehdä.
(Eli esimerkiksi:
foreach($this->nayttelijat as $avain => $nayttelija)jne.) - Tee luokalle metodi tulosta(), joka tulostaa olion tiedot alla olevassa muodossa:

Container-luokan tekeminen
Tehdään luokka, joka sisältää elokuva-olioita.
- Luo uusi PHP-tiedosto nimelle elokuvat.class.php.
- Lisää tiedoston alkuun määritys, jolla saat liitettyä elokuva.class.php-tiedoston mukaan.
require_once 'elokuva.class.php'; - Tee tiedostoon luokka nimeltä elokuvat.
- Laita luokalle attribuutiksi (private) $elokuvat-taulukko.
- Tee luokalle metodi lisaa_elokuva($arvo), joka lisää $elokuvat-taulukkoon parametrina tuotavan elokuva-olion. Lisäykseen voit käyttää esimerkiksi array_push-funktiota. Tarkista lisätessä, ettei kyseistä elokuva-oliota ole jo taulukossa. Tarkistuksessa kannattaa käydä taulukko läpi foreach-rakenteella. Tarkistuksessa voit verrata elokuvien nimiä keskenään. Elokuvan nimen saat selville elokuva-olion hae_nimi()-metodilla.
- Tee luokalle metodi poista_elokuva($arvo), joka poistaa $elokuvat-taulukosta
parametrina tuotavan elokuva-olion. Poistoon voit käyttää
unset-funktiota. Poistaessa kannattaa käydä taulukko läpi
foreach-rakenteella ja selvittää jokaisella kerralla taulukon alkion arvon
lisäksi myös alkion avain, jotta tiedät mistä taulukon indeksistä poisto tulee tehdä. (Eli esimerkiksi:
foreach($this->elokuvat as $avain => $elokuva)jne.) Poistossa voit verrata elokuvien nimiä keskenään. Elokuvan nimen saat selville elokuva-olion hae_nimi()-metodilla. - Tee luokalle metodi tulosta(), joka tulostaa elokuvien nimet listaan käyttäen hyväksi
elokuva-olion tulosta()-metodia.

Luokkien käyttäminen
Luodaan luokista olioita ja käytetään olioiden metodeja.
- Luo uusi PHP-tiedosto nimelle leffat.php.
- Lisää tiedoston alkuun määritys, jolla saat liitettyä elokuvat.class.php-tiedoston mukaan.
elokuva.class.php-tiedostoa ei tarvitse liittää, koska se tulee elokuvat.class.php-tiedoston mukana.
require_once 'elokuvat.class.php'; - Luo elokuva-olio nimeltä $vares. Laita olion attribuutteihin mallikuvan mukaiset arvot.
- Lisää näyttelijäksi myös joku "väärä" henkilö.
$vares->lisaa_nayttelija('Antti Ekonoja'); - Tulosta elokuvan tiedot (käytä tulosta()-metodia).
- Poista "väärä" näyttelijä.
$vares->poista_nayttelija('Antti Ekonoja'); - Tulosta elokuvan tiedot (käytä tulosta()-metodia).
- Koita lisätä $vares-olio uudestaan (ei pitäisi onnistua).
- Luo joku toinenkin elokuva-olio (esim. mallikuvan $matti).
- Luo elokuvat-olio nimeltä $leffat.
- Lisää $vares ja toinen luomasi elokuva-olio leffat-olion $elokuvat-taulukkoon.
- Tulosta elokuvat (käytä leffat-olion tulosta()-metodia).
- Poista $vares-olio leffat-olion $elokuvat-taulukosta.
- Tulosta elokuvat (käytä leffat-olion tulosta()-metodia).
- Tarkista tulosteesta, että kaikki toimii varmasti oikein.
Lomake
- Lisää elokuvat-luokkaan metodi, joka osaa tulostaa elokuvan ja sen näyttelijöiden kysymiseen vaadittavat lomake-elementit. Riittää, että metodi osaa kysyä esim. viisi näyttelijää.
- Kokeile uuden metodin toimintaa ja lisää pääohjelmaan lomakkeen päärunko ja pyydä $leffat-oliota tulostamaan lomake-elementit oikeaan paikkaan.
- Lisää elokuvat-luokkaan metodi, joka osaa lisätä uuden elokuvan ja sen näyttelijät lomakkeelta tulleiden tietojen perusteella. Kirjoita tarvittavat yksinkertaiset tarkistukset, että tyhjiä kenttiä ei hyväksytä.
- Kokeile lisätä lomakkeella uusi elokuva.
- Muokkaa elokuvan lisäämismetodia niin, että metodi palauttaa tiedon onnistuiko lisäys vai ei. Jos lisäys epäonnistui niin alusta kysymiseen tarvittavat lomake-elementit jo syötetyillä tiedoilla ja muussa tapauksessa aloita tyhjällä lomakkeella.
- Kokeile lomakkeen toimintaa.
Serialisointi
- Lisätään elokuvat- ja elokuva-luokkiin serialisointi, jonka avulla oliot pystytään tallentamaan lomakkeelle ja myöhemmin palauttamaan sieltä. Kirjoita elokuva-luokkaan serialize-metodi, joka purkaa
olion sisällön merkkijonoksi, joka on muodoltaan sama kuin HTTP:n GET-pyyntö:
nimi=Vares - Yksityisetsivä&vuosi=2004&laji=Toiminta&ohjaaja=Aleksi Mäkelä&nayttelija[]=Juha Veijonen&nayttelija[]=Laura Malmivaara&nayttelija[]=Samuli Edelmann
- Lisää elokuvat-luokkaan myös serialize-metodi, joka luo jokaista elokuvaa
varten piilokentän lomakkeelle ja sijoittaa siihen elokuvan tiedot serialisoituina:
<input type="hidden" name="tallennettu[]" value="nimi=Vares - Yksityisetsivä&vuosi=2004&laji=Toiminta&ohjaaja=Aleksi Mäkelä&nayttelija[]=Juha Veijonen&nayttelija[]=Laura Malmivaara&nayttelija[]=Samuli Edelmann"/>
- Kutsu pääohjelmasta $leffat-olion serialisointi-metodia. Tutki sivun lähdekoodista, että kaikkien elokuvien tiedot näkyvät piilokentissä.
- Lisää elokuva-luokkaan deserialize-metodi, jonka perusteella elokuva osaa alustaa itsensä serialisoidusta merkkijonosta. Voit käyttää apuna parse_str-funktiota, jolla saat purettua serialisoidun merkkijonon $_GET-taulukkoa vastaavaan muotoon.
- Lisää elokuvat-luokkaan myös deserialize-metodi, joka osaa käydä läpi lomakkeelta tulleet kentät ja luoda niiden perusteella elokuvat käyttäen elokuva-luokan deserialize-metodia. Kokeile lisäillä lomakkeella uusia elokuvia. Jos kaikki toimii kuten pitääkin niin lisätyt elokuvat säilyvät lomakkeelle tulevien piilokenttien ansiosta.
Lisätehtävä
Lisää edellä tekemääsi lomakkeeseen myös virheilmoitukset.
Tehdään näyttelijästä olio pelkän stringin sijaan.
- Luo uusi PHP-tiedosto nimelle nayttelija.class.php.
- Tee tiedostoon luokka nayttelija ja keksi sille sopivat attribuutit (nimi, ikä jne.).
- Tee luokalle tarvittavat metodit.
- Muuta aiemmin tehtyä elokuva-luokkaa siten, että sen $nayttelijat-taulukkoon tallennetaankin nayttelija-olioita, eikä pelkästään nimiä stringeinä.
- Muuta elokuva-luokan metodit toimimaan nayttelija-olioiden kanssa stringien sijasta.
- Tarvitseeko elokuvat-luokalle tehdä mitään muutoksia?
- Muuta testilauseet (leffat.php) toimimaan uuden nayttelija-luokan kanssa.

Käyttäjien kommentit