PHP5: pieni olio-opas

PHP5: pieni olio-opas

Viesti Harr1l 16 Maalis 2007 19:58

Eli tämä ei taida toimia ollenkaan PHP4.x versioilla johtuen PHP5:n paremmista olio-ominaisuuksista. Esimerkki on suhteellisen yksinkertainen mutta vaatii hieman tietoa etukäteen PHP:stä. Itse saa sitten kehitellä mihin olioita käyttää ;)

Jos haluat nähdä koodin värillisenä, klikkaa tästä.

EDIT: Hieman alkutietoa: Konstruktori luo olion, eli määrittää arvot sisäisiin muuttujiin. Private on vain kyseisen luokan sisäinen muuttuja, kun taas protected on myös aliluokille. Public nimensä mukaisesti näkyy ulos ja public funktioita voidaan käyttää $olio->metodi (funktio). Aliluokka perii kaikki yliluokan toiminnot.

Koodi: Valitse kaikki
<?php

//tehdään luokka
class PiirraKuva {
   //protected muuttujat näkyvät myös aliluokille, mutta eivät ole muutettavissa olion ulkopuolelta
   protected $korkeus, $leveys, $numero;
   
   //konstruktori, luodaan olio
   public function PiirraKuva($korkeus, $leveys) {
      //sijoitetaan määritellyt arvot olion sisäisiin muuttujiin
      //$this->muuttuja on olion sisäinen muuttuja, joka ei siis sekotu olioiden kesken.
      $this->korkeus = $korkeus;
      $this->leveys = $leveys;
   }
   
   //metodit ovat kuten funktiot, eli tekevät jonkin tietyn toiminnon, tässä vain olion sisäisiä
   //metodit ->
   
   //palautetaan korkeus
   public function kerroKorkeus() {
      return $this->korkeus;
   }
   
   //palautetaan leveys
   public function kerroLeveys() {
      return $this->leveys;
   }
   
   //piirretään määritetyn kokoinen musta kuva
   public function piirra() {
      //kuvannimi vain muodon vuoksi
      $kuvannimi = "musta.png";
      //poistetaan jos sattuu olemaan jo edellinen samalla nimellä
      @unlink($kuvannimi);
      //tehdään oikean kokoinen kuva
      $kuva = imagecreate($this->leveys, $this->korkeus);
      //musta, tässä ei väriä määritetty
      imagecolorallocate($kuva, 0, 0, 0);
      //tallennetaan kuva tiedostoon
      imagepng($kuva, $kuvannimi);
      imagedestroy($kuva);
      //palautetaan kuvannimi, jotta saadaan näytettyä oikea kuva
      return $kuvannimi;
   }
   
   // <- metodit
}

//luodaan aliluokka (extends) joka perii PiirraKuva:n ominaisuudet
class PiirraVariKuva extends PiirraKuva {
   //tällä luokalla ei ole aliluokkaa, joten voidaan pitää private-muuttujia
   private $puna, $viher, $sini;
   
   //oma konstruktori, tämä saa väriarvot myös
   public function PiirraVariKuva ($korkeus, $leveys, $puna, $viher, $sini) {
      //käytetään yliluokan konstruktoria määrittämään korkeus ja leveys; ei tarvitse kirjoittaa kahdesti
      parent::__construct($korkeus, $leveys);
      //värit omiin muuttujiin
      $this->puna = $puna;
      $this->viher = $viher;
      $this->sini = $sini;
   }
   
   //piirretään värillinen kuva
   public function piirra() {
      $kuvannimi = "vari.png";
      @unlink($kuvannimi);
      $kuva = imagecreate($this->leveys, $this->korkeus);
      //tietyn värinen kuva
      imagecolorallocate($kuva, $this->puna, $this->viher, $this->sini);
      imagepng($kuva, $kuvannimi);
      imagedestroy($kuva);
      return $kuvannimi;
   }
}

//luodaan oliot
$kuva1 = new PiirraKuva(160, 140);
$kuva2 = new PiirraVariKuva(140, 120, 255, 0, 0);

//tehdään taulukko hahmottamiseksi
echo '<html>';
echo '<table border="1">';
echo '<tr><td>Kuva1</td><td>Kuva2</td></tr><tr><td>';
//metodeja kutsutaan $olionnimi->metodi
//kutsutaan ja tulostetaan ensimmäisen kuvan korkeus ja leveys
echo $kuva1->kerroKorkeus() . ' x ' . $kuva1->kerroLeveys();

echo '</td><td>';
//kutsutaan ja tulostetaan toisen kuvan korkeus ja leveys (käyttää yliluokan metodeita)
echo $kuva2->kerroKorkeus() . ' x ' . $kuva2->kerroLeveys();

echo '</td></tr><tr><td>';
//piirretään kuva1
echo '<img src="'.$kuva1->piirra().'" alt="" />';

echo '</td><td>';
//piirretään kuva2
echo '<img src="'.$kuva2->piirra().'" alt="" />';

echo '</td></tr>';
echo '</table>';
echo '</html>';

?>


EDIT: Tässä on ehkä hieman selkeyttävä kuva:

[img:local=836a48d79c96d5ba6f119a487a215544.png]http://kaatis.myftp.org/uppi/tiedostot/03c9coliot.jpg[/img]
Viimeksi muokannut Harr1l päivämäärä 16 Maalis 2007 22:55, muokattu yhteensä 1 kerran
Käyttäjän avatar
Harr1l
 
Viestit: 61

Viesti Puniikki_elääkkeellä 16 Maalis 2007 22:15

olio oppaaksi ois voina selitellä noita juttuja vähä enemmä esim mitä eroa on noilla protect ja public ja private arvoilla. mitä konstructori tekee käytännössä?
Self-commited suicide
It seems to be the choice of mind
Maybe I'm weak but I can't stand the pain that I cause
Now I know that I am one step closer
To the end of this meaningless life


emptiness dy fi
Käyttäjän avatar
Puniikki_elääkkeellä
 
Viestit: 812

Palaa alueelle Ohjelmointioppaat