PHP-perusteita - Luento 3
- Luentotaltiointi
- Kielen valinta
- Esimerkkisivu
- Virheilmoitukset ja asetukset
- Syntaksi
- Tietotyypit
- Muuttujat
- Operaattorit
- Kontrollirakenteet
- Lisätietoa
PHP on Perliä muistuttava skriptikieli, joka soveltuu WWW-sovellusten tekemiseen. PHP-skriptit voidaan upottaa suoraan XHTML-dokumenttiin. Koodin tulkitseminen tehdäänsivun pyynnön yhteydessä. Käsittelyn tekee PHP-tulkki, joka voidaan asentaa WWW-palvelimeen kytkeytyvänä moduulina tai erillisenä CGI-ohjelmana.
Tämän luennon lähteenä on käytetty Sami Kollanuksen tekemää PHP-opasta.
Luentotaltiointi
- sovellukset03.mp3 13M
- sovellukset03.wmv 34M
- sovellukset03.avi 147M
Kielen valinta
PHP:n hyviä puolia:
- Suhteellisen helppo asentaa
- Toimii useimmilla palvelimilla
- Paljon käytetty
- Melko helppo oppia
- Syntaksi yksinkertainen
- Eri versioiden yhteensopimattomuus
- Kielen suunnitteluvirheet
- Heikko dokumentaatio
- Nimiavaruudet puuttuvat
- Sekava vakiofunktiovalikoima
Skriptikielien vertailua:
Esimerkkisivu
XHTML-dokumentti PHP-kielellä tuotettuna:
<?php print '<?xml version="1.0" encoding="ISO-8859-1"?>'; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fi">
<head>
<title>Hello!</title>
</head>
<body>
<h1>Tulostetaan PHP:llä:</h1>
<p>
<?php print "Hello World!"; ?>
<p>
</body>
</html>
Esimerkissä tekstikappaleen sisään tulostetaan teksti "Hello World!". Tulostus saadaan aikaan print-komennolla antamalla sille parametriksi tulostettava merkkijono. Tulostuslause sijoittaa siis lopulta tulostettavan merkkijonon <?php-elementin paikalle XHTML-koodissa. Yhtä hyvin tekstikappaleen aloitus- ja lopetuselementit olisi voitu sijoittaa PHP:n tulostuslauseeseen alla olevan esimerkin mukaisesti.
<?php print "<p>Hello World!</p>" ?>
Virheilmoitukset ja asetukset
PHP:n virheilmoitusten näkyminen selaimessa riippuu käytetyn palvelimen asetuksista. Jos haluaa varmistaa, että virheilmoitukset näkyvät kannattaa php-ohjelmansa alkuun kirjoittaa:
error_reporting(E_ALL);
ini_set('display_errors', '1');
PHP:hen liittyviä asetuksia voi vaihtaa myös php.ini-tiedoston ja .htaccess-tiedoston avulla. Tutustutaan näihin myöhemmin.
Syntaksi
PHP-sivu on oikeastaan XHTML-sivu, joka nimetään tavallisesti .php-päätteiseksi tiedostoksi. PHP-sivulla ohjelmakoodi kirjoitetaan <?php-elementin sisään:
<?php koodia...koodia... ?>
Sivulla voi olla useita <?php-elementejä ja elementtejä voi sijoittaa mihin tahansa kohtaan XHTML-koodin sekaan. On vain muistettava pitää huolta siitä, PHP:llä tulostettaessa saadaan aikaan validia XHTML-koodia.
Tässä muutama yleinen huomio PHP:n syntaksista:
- Lauseet päättyvät puolipisteeseen kuten Javassa. Puolipistettä ei kuitenkaan ole pakko kirjoittaa, jos <?php-elementti sisältää vain yhden lauseen.
- Kommentit ovat kuten Javassa. Yhden rivin kommentti alkaa //-merkeillä. Useamman rivin kommentti tulee merkkien /* ja */ väliin.
- Lohkomerkkeinä toimivat aaltosulkeet {} kuten Javassa.
Kirjoitettaessa XHTML-standardin mukaista PHP-sivua on huomattava aina ensimmäisellä rivillä oleva XML-version määrittely. Se alkaa samoilla <?-merkeillä kuin PHP-elementti, minkä vuoksi PHP-tulkki yrittää tulkata sitä PHP-koodina. Siitä puolestaan seuraa virhe ja sivun suoritus keskeytyy. Tämä ongelma ratkaistaan sijoittamalla alla olevan esimerkin mukaisesti XML-version määrittely PHP-elementtiin tulostuslauseeseen.
<?php print '<?xml version="1.0" encoding="ISO-8859-1"?>'; ?>
Esimerkki ehtorakenteesta
PHP-elementin voi haluttaessa sulkea niin, että ehtolauseen suorituslohko jätetään auki. Myöhemmin on silloin tultava toinen PHP-elementti, jossa suorituslohko suljetaan. Väliin voidaan kirjoittaa XHTML-koodia, joka toteutetaan ehdon toteutuessa. Alla on esimerkki tästä. Hyötynä on siis se, ettei kaikkia XHTML-lauseita tarvitse kirjoittaa PHP:n tulostuslauseilla.
<?php if(ehto) { //Tässä jätetään lohko auki ?>
<p>
Tämä kappale näkyy, mikäli ehto toteutuu
</p>
<?php } else { //Tässä suljetaan if-lohko ja jätetään else-lohko auki ?>
<p>
Tämä kappale näkyy, jos ehto on epätosi
</p>
<?php } //Lopuksi suljetaan else-lohko ?>
Tulostus
Edellisissä kappaleissa esitetyissä esimerkeissä tulostukseen on käytetty print-funktiota.
Usein näkee käytettävän myös echo-komentoa. On yleensä täysin makuasia kumpaa haluaa käyttää.
Include ja require
PHP-sivulle voi liittää toisen tiedoston include()- tai require()-funktioilla.
Funktiot sijoittavat yksinkertaisesti parametrina annetun tiedoston sisällön funktion
paikalle. Toiseen tiedostoon voi olla viisasta sijoittaa vaikkapa itse kirjoitettu
funktiokokoelma tai joitakin dokumentin osia. Alla on esimerkki PHP-sivun rakenteesta,
jossa dokumentin alku ja loppu ovat erillisissä tiedostoissa. Tällä tavalla saadaan
jokaiselle dokumentille varmasti samanlainen runko.
<?php
include("alku.txt");
...
PHP-koodia
...
include("loppu.txt");
?>
include()- ja require()-funktiot toimivat muuten täysin identtisesti, mutta
require()-funktio aiheuttaa epäonnistuessaan vakavan virheen. Vakava virhe tarkoittaa
sitä, että sivun suoritus lopetetaan virhetilanteeseen. include()-funktiota käytettäessä
suoritusta jatketaan joka tapauksessa.
Tietotyypit
PHP:ssä on kahdeksan perustietotyyppiä:
Boolean
Boolean-tyyppinen muuttuja saa luonnollisesti arvokseen joko TRUE tai FALSE. Isoilla ja pienillä kirjaimilla ei ole kirjoitusasussa väliä, vaan esimerkiksi TRUE voidaan kirjoittaa true tai True.
Integer
Integer tarkoittaa kokonaislukua. Integerin maksimipituus riippuu käyttöjärjestelmästä, mutta hyvin yleisesti se on 32-bittinen luku (noin +/- 2.15e+9). Mikäli integer-tyyppiseen muuttujaan yritetään sijoittaa itseisarvoltaan liian suuri luku, muuttuu muuttuja float-tyyppiseksi.
Float
Float on PHP:n reaalilukutyyppi. Myös sen maksimipituus riippuu käyttöjärjestelmästä, mutta yleisesti se on 64-bittinen luku (noin 1.8e308).
String
String on PHP:n merkkijonotyyppi. Yksirivinen merkkijono voidaan määritellä joko lainausmerkeissä tai heittomerkeissä. Lisäksi voidaan alku- ja lopputunnistetta käyttämällä määritellä samalla kertaa useampirivinen merkkijono. Alla on esimerkki, jossa tulostetaan merkkijono jokaisella tavalla ilmaistuna.
<?php $mjono = "jotain"; print "Merkkijono lainausmerkeissä $mjono\n"; print 'Merkkijono heittomerkeissä $mjono\n'; $s = <<<TUNNISTE Tässä on useamman rivin mittainen merkkijono $mjono esimerkkitekstiä lisää tekstiä. TUNNISTE; print $s; ?>
Lainausmerkeillä ja heittomerkeillä on se ero, että heittomerkkien sisään kirjoitettua merkkijonoa ei tulkita. Siis esimerkissä heittomerkkien sisään laitettu tulostettava merkkijono tulostuu aivan niin kuin koodissa lukee: Merkkijono heittomerkeissä $mjono\n. Lainausmerkkien sisään määritellyssä merkkijonossa puolestaan tulkitaan muuttujat ja koodatut erikoismerkit (esimerkissä rivinvaihto, \n). Esimerkissä lainausmerkkeihin määritelty merkkijono tulostuu: Merkkijono lainausmerkeissä jotain. Muuttujan nimen paikalle tulostuu muuttujan arvo ja lauseen lopuksi tulostetaan rivinvaihto. Rivinvaihdot selkeyttävät XHTML-lähdekoodia.
Esimerkissä viimeisenä on määritelty useamman rivin merkkijono. Määrittely alkaa <<<-merkeillä, joiden perään tulee tunnistemerkkijono. Useamman rivin merkkijonon määrittely päättyy samaan tunnistemerkkijonoon, joka täytyy olla omalla rivillään ja alkaa rivin ensimmäisestä merkistä. Useamman rivin merkkijono tulkitaan samalla tavalla kuin lainausmerkkeihin kirjoitettu merkkijono.
Array
Array-tietotyyppi tarkoittaa taulukkoa. Niistä kerrotaan erikseen myöhemmin taulukoiden yhteydessä.
Object
Object-tietotyyppi tarkoittaa oliota. Niistä voit katsoa lisätietoa php.net-sivuilta. Olioiden käyttö tullaan käymään läpi myös myöhemmillä luennoilla.
NULL
NULL tarkoittaa sitä, että muuttujalla ei ole määriteltyä arvoa. Sen kirjoitusasussa isoilla ja pienillä kirjaimilla ei ole väliä. Se voidaan siis kirjoittaa vaikkapa null tai Null.
Resource
Resource on erikoinen tietotyyppi, joka sisältää viitteen johonkin ulkopuoliseen tietolähteeseen. Esimerkiksi tiedostokahvoja käsiteltäessä on kyseessä resource-tyyppinen muuttuja.
Muuttujat
Muuttujien käytöstä
PHP on ns. heikosti tyypitetty kieli, jossa muuttujalle ei tavallisesti määritellä tietotyyppiä. Muuttujan tietotyyppi määräytyy automaattisesti muuttujan arvon mukaan. Muuttujista on muistettava se, että kaikki muuttujien nimet on aloitettava $-merkillä. Muuttujan nimi ei saa alkaa numerolla. Muuttujien nimissä voi olla myös skandinaavisia merkkejä kuten Javassa. Alla on esimerkki muuttujien käytöstä.
<?php $eka = 234; //integer $toka = "234"; //string $kolmas = 1.3555; //float $neljäs = "1.3555"; //string $viides = "tekstiä"; //string print $eka; //234 print $eka+$toka; //468 print $eka.$toka; //234234 print $neljäs+$toka; //235.3555 print $eka.$kolmas; //2341.3555 print $eka*$viides; //0 ?>
Tulostuslauseiden kommenteissa on esitetty esimerkkikoodin tulostus käytännössä. Esimerkiksi neljännessä tulostuslauseessa on +-operaattorilla laskettu yhteen kaksi merkkijonoa. PHP-tulkki muuntaa automaattisesti +-operaattorin molemmilla puolilla olevat merkkijonot luvuiksi. Mikäli merkkijono ei muodosta lukua, käsitellään sitä nollana. Tämä nähdään viimeisestä tulostusesimerkistä, jossa on kertolasku.
Muuttujien näkyvyys
Lähes kaikki muuttujat ovat PHP:ssä globaalisti näkyvissä. Siis ohjelmalohkot {...} eivät rajoita muuttujien näkyvyyttä kuten Javassa. Myöskään PHP-elementit (<?php ... ?>) eivät rajoita muuttujien näkyvyyttä. Poikkeus globaaliin näkyvyyteen ovat funktiot, joissa niiden ulkopuolella määritellyt muuttujat eivät ole näkyvissä. Alla on esimerkki muuttujien näkyvyydestä.
<?php
$a = 12;
$b = " Ei määritelty";
if($a == 12) {
$b = " Ehto toteutui";
}
?>
... XHTML-koodia ...
<?php
print $a.$b; //Tulostaa: 12 Ehto toteutui
?>
Esimerkistä nähdään, ettei muuttujan näkyvyys rajoitu ohjelmalohkon sisään kuten Javassa. $b on määritelty if-lohkon sisällä, mutta siitä huolimatta se näkyy vielä lopussa olevassa tulostuslauseessa. Funktioissa ei kuitenkaan näy niiden ulkopuolella määritellyt muuttujat. Alla on esimerkki tästä. Lisää tietoa tulee funktioiden käsittelyn yhteydessä myöhemmillä luennoilla.
<?php
function muuta($a) {
$a = "Muutettu";
}
$a = 12;
muuta($a);
print $a; //Tulostaa: 12
?>
Vakioiden määrittäminen
Vakiot määritellään PHP:ssä define()-funktiolla. Poikkeuksena muuttujien nimiin,
vakioiden ei tarvitse alkaa $-merkillä. Vakion arvoksi voi määritellä ainoastaan
boolean-arvon, luvun tai merkkijonon. Alla on esimerkki vakion määrittämisestä.
<?php define(VAKIO, "Joku merkkijono"); print VAKIO; //Tulostaa: Joku merkkijono ?>
Tyypinmuunnokset
Haluttaessa varmistaa, että muuttuja käsitellään varmasti halutuntyyppisenä voidaan haluttu tyyppi ilmaista suluissa muuttujan edellä:
<?php $a = "12.345"; $b = (int)$a; // $b:n avoksi tulee 12 ?>
Edellä esitetty ilmaisutapa ei muuta muuttujan tietotyyppiä, vaan muuttujaa ainoastaan
käsitellään erityyppisenä. Jos muuttujan tyyppiä halutaan aidosti muuttaa, täytyy
se tehdä settype()-funktiolla. Funktiolle annetaan kaksi parametria: muuttuja ja
uusi tietotyyppi:
settype($a, "integer");
Esimääritellyt muuttujat
PHP:ssä on useita ns. esimääriteltyjä muuttujia, jotka PHP alustaa automaattisesti käytettäviksi. Seuraavassa on lueteltu tärkeimpiä näistä. Linkit osoittavat http://www.php.net-sivustolla oleviin määrittelyihin.
- $_SERVER sisältää tietoa esim. skriptin sijainnista ja http-kutsun otsikkotietoja.
- $_GET sisältää get-metodilla sivulle lähetetyt lomaketiedot
- $_POST sisältää post-metodilla sivulle lähetetyt lomaketiedot
- $_FILES sisältää lomakkeella palvelimelle lähetetyt tiedostot
- $_COOKIE sisältää selaimen lähettämän evästeen (cookie) tiedot
- $_SESSION sisältää käynnissä olevan session sessiomuuttujat
- $_REQUEST sisältää $_POST, $_GET ja $_COOKIE -muuttujien sisällöt
Kaikki nämä esimääritellyt muuttujat ovat assosiatiivisia taulukkoja. Tietoihin viitataan halutun tiedon nimen perusteella. Esimerkiksi get-metodilla 'etunimi'-nimisestä lomakekentästä lähetettyyn tietoon viitataan seuraavasti:
$_GET["etunimi"]
Hyödyllisiä funktioita muuttujia käsitellessä
isset()
isset()-funktio tarkistaa, onko jollain muuttujalla arvoa. Se palauttaa tuloksena
joko true tai false. On syytä muistaa,
että tyhjä arvokin on arvo. Siis jos isset()-funktiolle annetaan parametriksi esimerkiksi
tyhjä merkkijono, se palauttaa arvon true.
if(isset($muuttuja)) {
print "Muuttujalla on arvo";
} else {
print "Muuttujalla ei ole arvoa";
}
empty()
empty()-funktio tutkii, onko parametrina annetulla muuttujalla tyhjä arvo. Se palauttaa
true, jos arvo on tyhjä ja false, jos arvo ei ole tyhjä.
Tyhjäksi arvoksi tulkitaan tietotyypistä riippuen false, tyhjä merkkijono, nolla ja NULL.
gettype()
gettype()-funktio palauttaa merkkijonona parametrina annetun muuttujan tietotyypin.
$muuttuja = "jotain vaan"; print gettype($muuttuja); //tulostaa: string
"is_type"-funktiot
Jos halutaan tarkistaa, onko muuttuja tietyn tyyppinen, on siihen suositeltavaa käyttää
is_type-tyyppisiä funktioita. Kaikille tietotyypeille on erikseen tälläinen
funktio: is_bool(), is_int(), is_float(), is_string(), is_array(), is_object(), is_null()
ja is_resource(). Funktiot palauttavat true, jos muuttuja on kysyttyä
tyyppiä ja false, jos muuttuja ei ole kyseistä tyyppiä.
if(is_int($muuttuja)) {
print '$muuttuja on integer-tyyppinen';
}
Erilaisiin muuttujien testaustarkoituksiin on myös joitakin muita funktioita. Esimerkiksi
is_numeric()-funktio testaa onko muuttuja lukutyyppiä tai onko se numeerinen
merkkijono.
var_dump()
var_dump()-funktio tulostaa samalla kertaa muuttujan tietotyypin ja sisällön.
Se voi olla joskus hyödyllinen ohjelmaa testatessa.
Operaattorit
Aritmeettiset operaattorit
Aritmeettiset operaattorit toimivat aivan kuten Javassa. Poikkeuksena on muuttujien käyttäytyminen operaattoreiden yhteydessä. Javassa täytyy muistaa muuntaa muuttujat operaattorin vaatimaan tietotyyppiin. PHP taas tekee sen automaattisesti. Esimerkiksi merkkijonomuodossa olevia lukuja voi laskea yhteen välittämättä tietotyypin muunnoksista. PHP:ssä on kuitenkin oltava samalla varovainen tämän ominaisuuden kanssa. Tästä on esimerkki muuttujia käsittelevässä kappaleessa. Alla olevassa taulukossa on lueteltu PHP:n aritmeettiset operaattorit.
| Esimerkki | Selitys |
|---|---|
| $a + $b | Yhteenlasku |
| $a - $b | Vähennyslasku |
| $a * $b | Kertolasku |
| $a / $b | Jakolasku |
| $a % $b | Jakojäännös |
Merkkijonojen yhdistäminen
Katenointi eli merkkijonojen yhdistäminen tapahtuu .-operaattorilla. Tietotyypin muunnos tapahtuu tarvittaessa automaattisesti. Esimerkiksi lukutyyppiset muuttujat voi yhdistää merkkijonoon yhdistämisoperaattorilla:
<?php $a = 12; $b = 34.56; print "jono ".$a.$b; //tulostaa: jono 1234.56 ?>
Arvon asettaminen
Myös muuttujan arvon asettamisessa toimivat samat operaattorit kuin Javassa:
<?php $a = 1; $a += 2; //muuttujaan lisätään 2 $a -= 3; //muuttujasta vähennetään 3 $b = "Merkki"; //lyhyt muoto toimii myös tässä $b .= "jono"; //$b:n arvo: "Merkkijono" ?>
Lisäys-/vähennysoperaattorit
Lisäysoperaattori (++) ja vähennysoperaattori (--) toimivat kuten Javassa.
Jos operaattori sijoitetaan muuttujan perään (esim. $a++), suoritetaan operaatio vasta suorituksessa
olevan lausekkeen jälkeen. Jos operaattori sijoitetaan muuttujan edelle (esim. --$a),
suoritetaan operaatio ennen suorituksessa olevaa lausetta.
Alla on esimerkkejä tästä.
<?php $a = 1; print $a++; //tulostaa: 1 print $a; //tulostaa: 2 print --$a; //tulostaa: 1 ?>
Loogiset operaattorit
Alla olevassa taulukossa on lueteltu tärkeimmät PHP:n loogiset operaattorit.
| Esimerkki | Selitys |
|---|---|
| $a && $b | tosi, kun sekä $a että $b ovat tosia |
| $a || $b | tosi, kun vähintään toinen ($a tai $b) on tosi |
| !$a | tosi, kun $a on epätosi |
Vertailuoperaattorit
PHP:n vertailuoperaattorit on lueteltu alla olevassa taulukossa. Ne ovat paria lisäystä lukuun ottamatta samat kuin Javassa.
| Esimerkki | Selitys |
|---|---|
| $a == $b | $a on yhtäsuuri kuin $b |
| $a === $b | $a on yhtäsuuri ja samaa tietotyyppiä kuin $b |
| $a != $b | $a on erisuuri kuin $b |
| $a <> $b | sama kuin edellä |
| $a !== $b | $a on erisuuri kuin $b tai eri tietotyyppiä |
| $a < $b | $a on pienempi kuin $b |
| $a > $b | $a on suurempi kuin $b |
| $a <= $b | $a on pienempi tai yhtäsuuri kuin $b |
| $a >= $b | $a on suurempi tai yhtäsuuri kuin $b |
Taulukosta nähdään erona Javaan === ja !== operaattorit. Tavallisilla yhtäsuuruus-/erisuuruusoperaattoreilla voidaan vertailla toisiinsa esimerkiksi lukua ja merkkijonoa, joka sisältää luvun. Jos halutaan huomioida myös tietotyyppi, täytyy käyttää ===- ja !==-operaattoreita.
Huom! Merkkijonoja ei suositella vertailtavan toisiinsa
vertailuoperaattoreilla (vaikka se yleensä toimiikin). Merkkijonojen samankaltaisuus on sen sijaan
mieluummin tarkistettava strcmp()-funktiolla seuraavan esimerkin mukaisesti.
Funktio palauttaa 0, jos vertailtavat merkkijonot ovat samat. Jos ensimmäisenä
parametrina viety merkkijono on pienempi kuin toisena parametrina viety merkkijono, funktio
palauttaa negatiivisen arvon (< 0). Jos taas ensimmäisenä parametrinä viety merkkijono on
suurempi kuin toisena parametrinä viety merkkijono, fukntio palauttaa positiivisen arvon (> 0).
<?php
if(!strcmp($jono1, $jono2)) {
print '$jono1 ja $jono2 ovat yhtä suuret';
}
?>
Kontrollirakenteet
Kontrollirakenteet voidaan kirjoittaa täysin C-kielestä (ja Javasta) tutulla tavalla. Niiden lisäksi sama asia voidaan usein ilmaista Perlille tyypillisellä tavalla.
If, else, elseif
Ehtolauseet kirjoitetaan aivan C-kielestä (ja Javasta) tutulla tavalla. Seuraavassa
on esimerkki, jossa vertaillaan kahta muuttujaa ($eka ja $toka) toisiinsa. Siinä käsitellään
erikseen tapaukset $eka > $toka, $eka < $toka ja $eka = $toka.
<?php
if ($eka > $toka) {
print "eka on suurempi kuin toka";
} elseif ($eka == $toka) {
print "eka on yhtäsuuri kuin toka";
} else {
print "eka on pienempi kuin toka";
}
?>
PHP hyväksyy ehtolauseeseen boolean-tyyppisen arvon lisäksi myös muita tietotyyppejä. Luku nolla, tyhjä merkkijono ja esimerkiksi tyhjä taulukko tulkitaan epätodeksi. Kaikki näistä 'nolla-arvoista' poikkeavat arvot tulkitaan todeksi. Alla on esimerkki tästä. Esimerkin alussa alustetaan merkkijono tyhjäksi. Lopussa voidaan tutkia, onko välissä olevan koodin suorituksen aikana merkkijonoon tullut sisältöä.
<?php
$s = "";
...
koodia
...
if($s) {
print "Merkkijonoon on tullut sisältöä.";
}
?>
While, do...while, for
Nämä silmukkarakenteet voidaan kirjoittaa täsmälleen samalla tavalla kuin C-kielessä (ja Javassa). Alla on tästä yksinkertainen esimerkki, jossa suoritetaan tulostuslause kymmenen kertaa kolmella tavalla.
<?php
$a = 10;
$i = 0;
while($i<$a) {
print "while-kierros numero ".($i+1);
$i++;
}
$i=0;
do {
print "do...while-kierros numero ".($i+1);
$i++;
} while($i<$a);
for($i=0; $i<$a; $i++) {
print "for-kierros numero ".($i+1);
}
?>
Break, continue
break ja continue toimivat myös C-kielestä tutulla tavalla. break-komennolla
katkaistaan silmukan suoritus kokonaan ja continue-komennolla hypätään silmukan
suorituksessa seuraavalle kierrokselle. PHP:ssa on kuitenkin lisäksi ominaisuus,
jonka avulla voidaan hypätä sisäkkäisistä silmukoista määrätty määrä portaita ulospäin.
Seuraava esimerkki valaisee tätä tilannetta.
<?php
$a=10;
for($i=0; $i<$a; $i++) {
for($j=0; $j<$a; $j++) {
if($i==1) break 2;
print "kierros $i.$j\n";
}
}
?>
Esimerkissä on kaksi sisäkkäistä for-silmukkaa, joiden avulla tulostetaan kymmenyksen
välein luvut 0.0-9.9. Sisempään silmukkaan on määritelty ehto, jossa toteutetaan
break-lause, mikäli ulompi silmukka on toisella kierroksella. Jos tässä kohdassa
olisi tavallinen break-lause, jäisi ainoastaan ulomman silmukan toinen kierros
suorittamatta. Siis lukusarjasta jäisi välistä luvut 1.0-1.9. Tässä esimerkissä ilmaisu
'break 2;' tarkoittaa sitä, että keskeytetään samalla kokonaan myös ulomman silmukan suoritus.
Siis lukusarjan tulostus päättyykin lukuun 0.9.
break- ja continue-lauseiden yhteydessä voidaan kokonaisluvulla ilmaista se,
kuinka monta porrasta hypätään silmukoista ulospäin. Luku 1 tarkoittaa sisintä
suoritettavaa silmukkaa, jota ollaan suorittamassa. Se luku voidaan jättää ilmoittamatta,
sillä sehän tarkoittaa samaa asiaa kuin break- tai continue-lause ilman erillistä
määrettä. Esimerkissä break-lause on muodossa 'break 2'. Se tarkoittaa siis, että hypätään
suoritettavan silmukan lisäksi ulos myös sitä ulommasta silmukasta.
Switch
switch-lause on myöskin melko samanlainen kuin C-kielessä (ja Javassa). Parametriksi hyväksytään sekä
merkkijono, kokonaisluku että desimaaliluku. Määritellyt tapaukset suoritetaan järjestyksessä alusta loppuun,
ellei suoritusta katkaista break-lauseella, kuten yleensä on tapana. Alla on esimerkki
switch-lauseen toteutuksesta.
<?php
switch($i) {
case 0:
case 1:
print "$i on 0 tai 1\n";
case 4:
print "$i on 0, 1 tai 4\n";
break;
case 5:
print "$i on 5\n";
break;
default:
print "$i on 2, 3 tai suurempi kuin 5\n";
}
?>
Esimerkin mukaisesti case-tapaus voidaan haluttaessa jättää tyhjäksi. Tapaukset suoritetaan
joka tapauksessa järjestyksessä seuraavaan break-lauseeseen asti. Siis $i-muuttujan ollessa
arvossa 0 tai 1, suoritetaan sekä 'case 1' ja 'case 4' -kohtiin määritelty toteutus. Suoritus loppuu
'case 4'-kohdassa määriteltyyn break-lauseeseen. Jos $i-muuttujan arvo on 4 tai 5, suoritetaan
vain siihen kohtaan (case 4 tai case 5) kirjoitettu koodi. Kaikissa muissa tapauksissa
toteutetaan 'default'-kohta.
Alla olevassa esimerkissä parametrina on käytetty merkkijonoa. Toimintalogiikka on edellisen esimerkin kaltainen.
Esimerkki voisi olla vaikkapa erään sivuston pääsivun (index.php) toiminnallisuuden toteuttaminen switchin avulla.
$toiminto-muuttujan arvo voitaisiin ottaa esimerkiksi $_GET["toiminto"]-muuttujasta.
<?php
switch($toiminto) {
case "hallinta":
//ohjataan käyttäjä sivuston hallintaan
break;
case "sisalto":
//ohjataan käyttäjä selailemaan sivuston sisältöä
break;
case "uloskirjaus":
//kirjataan käyttäjä ulos järjestelmästä
break;
default:
//ohjataan käyttäjä pääsivulle/sisäänkirjautumissivulle
}
?>
Lisätietoa
Oppaita PHP-kieleen:
Erot muihin skriptikieliin:

Käyttäjien kommentit
Erittäin hyvä opas!
Tosi asiallinen. Puuttuu kuitenkin tietoja pahimmista ongelmista mitä PHP-syntaksin kanssa voi tulla eteen. esim. Kuinka korjataan tällainen koodi? (Tehdäänkö nimen otto funktion avulla. Eikös se onnistunut pelkästään käyttämällä valmiita MUUTTUJIA. esim. nimi saatiin viittaamalla sitä lomakekenttää, johon käyttäjä kirjoittaa nimensä: a = $_POST[ "nimilomakekenttä" ]