Funktiot ja oliot

Luennolla käsitellään PHP:n funktioita ja olioita. Tutkitaan miten parametrien välitys toimii. Katsotaan, miten voidaan tehdä luokkia, luoda oliota ja käyttää niitä.

Luentotaltiointi

Ongelmia videon katselussa?

Lomakkeet ja tietosuoja

Henkilötietolain mukaan pääsääntöisesti kaikesta henkilötietojen automaattisesta käsittelystä tulee tehdä ilmoitus tietosuojavaltuutetulle. Esimerkiksi jos tehdään WWW-lomakkeita, joissa kysytään henkilöä koskevia arkaluonteisia tietoja, ja tallennetaan ne johonkin, niin tällöin tehtävä rekisteri-ilmoitus. Jos palvelua käytetään tietoverkossa, rekisteriseloste tulee liittää verkkopalvelun yhteyteen.

Kertausta

Kerrataan muutamia edellisten luentojen asioita.

Parametrit ja PHP-taulukot

Parametrit taulukoksi (lähdekoodi)

PHP ja HTML4

PHP ja HTML4-yhteensopivuus

Funktiot

<?php
function tulosta_kertotaulu($riveja, $sarakkeita) {
  print "<table>\n<tr><th> </th>";
  // ensimmäinen rivi
  for ($j=1;$j<=$sarakkeita;$j++) {
    print "<th>$j</th>";
  }
  print "</tr>\n";
  for ($i=1;$i<=$riveja;$i++) {
    // ensimmäinen sarake
    print "<tr><th>$i</th>";
    for ($j=1;$j<=$sarakkeita;$j++) {
      // normaalit solut
      print "<td>".($i*$j)."</td>";
    }
    print "</tr>\n";
  }
  print "</table>\n";
}

tulosta_kertotaulu(3,5);
tulosta_kertotaulu(9,9);
tulosta_kertotaulu(20,10);

?>

Funktion parametreista

Funktion parametrien nimet määrätään suluissa. Funktiota voi kutsua ylimääräisillä parametreilla, mutta nämä jätetään huomiotta. Funktio voi palauttaa jonkin arvon return -lausekkeella. Tällöin funktion suoritus loppuu ja annettu arvo palautuu siihen kohtaan, jossa funktiota kutsuttiin.

<?php
function tulosta_teksti($teksti) {
  echo $teksti;
}

$test = array("Tekstiä"," ","testiin.");

tulosta_teksti(1,"Muuli",$test);
?>

Kaikki saadut parametrit voidaan käydä läpi func_-alkuisilla funktioilla:

<?php
function summaa_luvut() {
  $param_lkm = func_num_args();
  $param_arvot = func_get_args();
  $summa = 0;
  
  for ($i = 0; $i < $param_lkm; $i++) {
    $parametri = $param_arvot[$i];
    if (is_numeric($parametri))
      $summa = $summa + $parametri;
  }
  return $summa;
}

print "<p>".summaa_luvut(1, 4, 5)."</p>";
print "<p>".summaa_luvut(2, 2, 2, 5)."</p>";

?>

Funktion parametrina voi olla myös taulukko:

<?php
function tulosta_tekstit($teksti, $taulukko, $teksti2) {
  echo $teksti;
  foreach ($taulukko as $muuttuja)
    echo $muuttuja;
  echo $teksti2;
}

$test = array("Tekstiä"," ","testiin.");

tulosta_tekstit("<p>",$test,"</p>");
?>

Muuttujien näkyvyys

Funktion sisällä esitellyt parametrit näkyvät vain funktion sisällä.

Esimerkki värillisenä

<?php

function tulosta_lkm() {
  print "<p>Lukumäärä on $lkm</p>";
}

function tulosta_omalkm() {
  $lkm = 3;
  print "<p>Oma lukumäärä on $lkm</p>";
}

function tulosta_paramlkm($lukumaara) {
  print "<p>Funktioon tuotu lukumäärä on $lukumaara</p>";
}


// ei tulosta lukumäärää, koska $lkm ei ole asetettu
print "<p>Funktion ulkopuolella lukumäärä on $lkm</p>";
// ei tulosta määrää, koska funktiossa ei määritelty $lkm
tulosta_lkm();
// tulostaa 3, koska funktion sisällä on määritelty $lkm-muuttuja
tulosta_omalkm();
// ei tulosta mitään, koska parametria ei olla välitetty funktioon
// antaa myös varoituksen koska parametria ei ole annettu!
tulosta_paramlkm();

// määrätään globaalilla näkyvyysalueella muuttuja $lkm
$lkm = 8;
// tulostaa 8
print "<p>Funktion ulkopuolella lukuja on $lkm</p>";
// ei tulosta mitään edelleenkään
tulosta_lkm();
// tulostaa 3, koska funktion sisällä on määritelty muuttuja $lkm
tulosta_omalkm();
// tulostaa 8, koska
tulosta_paramlkm($lkm);

?>

Referenssi

Normaali parametrin välitys väärin käytettynä:

<?php
function lisaa_kaksi($summattava) {
  // $summattava saa arvon 6, mutta näkyvyys on vain funktion sisällä
  $summattava = $summattava + 2;
  // $summattava on 8, mutta mitään ei palauteta funktiosta
}

$luku = 6;
lisaa_kaksi($luku);
print $luku; // tulostaa 6

?>

Normaali parametrin välitys:

<?php
function lisaa_kaksi($summattava) {
  // $summattava saa alkuksi arvon 6, ei muuta alkuperäistä arvoa $luku
  $summattava = $summattava + 2;
  // $summattava on 8 ja se palautetaan funktion arvona
  return $summattava;
}

$luku = 6;
// funktion arvo sijoitetaan muuttujaan $luku
// muuttaa entisen arvon 6:sta 8:aan
$luku = lisaa_kaksi($luku);
print $luku; // tulostaa 8

?>

Parametri referenssinä:

<?php
function lisaa_kaksi(&$summattava) {
  // $summattava viittaa nyt annettuun parametriin, tässä tapauksessa muuttujaan $luku
  $summattava = $summattava + 2;
  // $luku-muuttujan arvo kasvaa kahdella
}

$luku = 6;
lisaa_kaksi($luku);
print $luku; // tulostaa 8

?>

Referenssi välitettynä toiseen funktioon:

<?php

function lisaa_kaksi(&$summattava) {
   // $summattava viittaa nyt muuttujaan $luku
   $summattava = $summattava + 2; // $luku-muuttujan arvo kasvaa kahdella
}

function test(&$testi) {
   // $testi viittaa nyt muuttujaan $luku
   lisaa_kaksi($testi);
}

$luku = 6;
test($luku);
print $luku; // tulostaa 8

?>

Funktio-osoittimet

Jos muuttujassa on funktion nimi, niin sen nimistä funktiota voidaan kutsua suoraan antamalla muuttujan perään suluissa parametrit.

<?php

function tulosta_kissa() {
  print "Kissa";
}

function tulosta_luku($luku) {
  print $luku;
}

$funktio = "tulosta_kissa";
$funktio(); // tulostaa kissa
$funktio = "tulosta_luku";
$funktio(3); // tulostaa 3

?>

Oliot

Luentoesimerkin alkuosa

Tehdään luokka, joka kapseloi tekstilaatikon, osaa validoida itsensä ja täyttää oletusarvot lomakeparametrien avulla.

Lisätietoa

Kurssimateriaalien käyttäminen kaupallisiin tarkoituksiin tai opetusmateriaalina ilman lupaa on ehdottomasti kielletty!
http://appro.mit.jyu.fi/sovellukset/luennot/luento9/
© Jukka Mäntylä (jmantyla@mit.jyu.fi)< http://www.iki.fi/jmantyla/>
2006-03-23 09:36:11