PHP on serveripõhine, HTMLiga integreeruv skriptikeel. Loojaks oli Rasmus Lerdorf, kes 1994. aastal kirjutas endale veebitegemisvahedite komplekti. Selle nimeks oli alguses "Personal Home Page Tools" (siit PHP), hiljem aga defineeriti see lühend ringi kui "PHP Hypertext Preprocessor" (rekursiivne lühend nagu GNU ja mitmed teised). Tollal pidi veebilehe dünaamiliseks muutmiseks kasutama peamiselt Perlis või C-s kirjutatud CGI skripte, mis aga olid üksjagu kohmakad ja keerulised. PHP "vanemateks" võib pidada C-d, Javat ja Perli - sealt pärineb tema mitte kõige lihtsam võimalik süntaks, kuid see on ikkagi märksa lihtsam tüüpilise CGI programmi omast ning küllalt kergesti õpitav. PHP areneb kitsalt veebi täienduseks olevast nähtusest täismahulise programmeerimiskeele suunas - seni viimane, 5. versioon on modulaarse objektorienteeritud keelena võrreldav mistahes üldotstarbelise keelega.
Tänase veebi üks levinumaid tehnoloogiaid on ilmselt LAMP - Linuxi operatsioonisüsteem, Apache'i veebiserver, MySQL-andmebaasisüsteem ja PHP (mõnel juhul tähistab P ka Perli või Pythonit). Kes ei raatsi loobuda Windowsist, sellele sobib WAMP, päris microsoftlased aga kasutavad WIMPi - Windows, IIS-veebiserver, MS SQL või MySQL ja PHP.
PHP levib põhiosas GPL litsentsi alusel, mõned laiendused on mittevaba tarkvara. Ta sisaldub enamiku Linuxi suuremate distrode komplektis ja on eraldi saadaval ka veebist. PHP kasutamiseks ei pea olema võrku ühendatud - saab paigaldada kohaliku veebi- ja andmebaasiserveri. Üks variant:
PHP kirjutamiseks on erinevaid võimalusi:
Ehkki PHP on näiteks Javascriptiga võrreldes praktiliselt täisfunktsionaalne programmeerimiskeel ("suurtest" lahutavad teda vaid mõned jooned, mis võib-olla tulevikus kaovad), on ta intuitiivselt ehk kõige paremini mõistetav kui HTML-i "pikendus". Sellisena on ta Javascripti kolleeg, ent viimasest erinevalt on PHP serveripõhine nagu CGI skriptid - kui Javascripti programm loetakse koos veebilehega kasutaja brauserisse ning täidetakse seal, siis PHP programm käivitatakse serveris ja kasutaja brauser näitab vaid tulemust.
Veel ühe aspektina võib mainida asjaolu, et PHP-d kasutatakse põhiliselt HTML-i genereerimiseks - ehk siis eri tingimustele vastava veebilehe kujundamiseks. Näiteks võib PHP-ga kontrollida veebilehe lugemise kellaaega ning öelda vastavalt siis lugejale "Hommikust", "Päevast", "Õhtust" või "Ööd"; võib muuta ka veebilehe kujundust, pakkudes päeval heledamat ja öösel tumedamat kujundust vms.
PHP lisamisel veebilehele muutub see n.ö. kahesüsteemseks - üldiselt tõlgendab veebiserver seal olevat materjali kui HTML-i, PHP-märgendi kohtamisel aga vahetatakse HTML-rezhiim PHP vastu. PHP-rezhiimi siirdumiseks on neli varianti:
<?php PHP programm ?>
Kui pole head põhjust otsustada mõne muu variandi kasutamise kasuks, tasub alati jääda selle stiili juurde - see on kõige universaalsem.
<? PHP programm ?>
Lihtne ja lühike, seega kiiresti kirjutatav. Aga:
<% PHP programm %>
Ka hea lühike, kuid eeldab vastavat konfigureerimist, loob ohu tekitada segadus "päris" ASPi ehk siis VBScripti programmidega. Eriti ei soovitata.
<script language="php"> PHP programm </script>
Vahel hea selge kasutada (eriti suurte PHP-plokkide märkimisel), aga võib tekkida suur segadus Javascriptiga, mis kasutab sama lõpumärgendit (</script>).
Nagu igas keele õppimisel tavaks, kirjutame ka siin esimese programmina "Hello World" -programmi. Selleks aga on meil vaja luua harilik veebilehe raamistik. NB! Käesolevas loengutekstis on kasutatud XHTML 1.0-i (slaididel oli ruumi kokkuhoiu mõttes vanem HTML 4.01)!
<?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xml:lang="et" lang="et" xmlns="http://www.w3.org/1999/xhtml"> </html>
Salvestame selle näiteks nime all test.php .
Nüüd lisame vaid ühe rea PHP-koodi:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xml:lang="et" lang="et" xmlns="http://www.w3.org/1999/xhtml">
<?php print("tere-tere, maakera!"); ?>
</html>
Mõned märkused:
Avades nüüd oma brauseris loodud faili, peaksime nägema akna ülaservas kirja "Minu esimene PHP-leht" (<title>) ja põhiaknas "Tere tere, maakera!".
Uurida, mida teie kasutatavasse serverisse installitud PHP võimaldab. Selleks tuleb oma lehe koodi lisada rida phpinfo(); (vastava standardfunktsiooni väljakutse) .
Esmalt tuleb öelda, et PHP on programmeerimiskeelena küllaltki paindlik - ta lubab kasutada ka selliseid "lükkeid", mis C, Pascali või Java puhul kõne alla ei tuleks (näiteks on andmetüüpide kasutamine üsna vaba, muutujaid ei pea eelnevalt deklareerima jne). PHP algne eesmärk oli aidata kiiresti luua erinevaid veebirakendusi - seepärast oli alguses mugavus tähtsam kui täpsus (aja jooksul on see aga muutunud).
PHP ei ole siiski hiromant ega suuda mõtteid lugeda - kui kasutaja ületab segaduse tekitamises mingi kriitilise piiri, on tulemuseks kiri "parse error" ekraanil ning mittetöötav programm.
Igaks juhuks tuleks veel korrata - ehkki PHP ja HTML esinevad enamasti koos, ei ole PHP HTML ja seetõttu on ka nende mängureeglid erinevad. Eelneva programmeerimiskogemusega inimesele meenutab PHP ehk kõige enam C-d - sealt pärineb kõige enam mõjutusi, ehkki PHP esivanemateks loetakse C kõrval ka Unixi shell scripti, Perli ja Javat.
Nagu mainitud, ei olene PHP töö programmikoodi paigutusest - nagu ka HTML-is, ei loe siin klaviatuurilt tehtud reavahetused, tabulatsioonid ega ka korduvad tühikud.
Muutujate kasutus PHP-s sarnaneb teiste programmeerimiskeelte praktikale - need on nimedega mäluväljad, kuhu saab talletada konkreetseid väärtusi. Erinevalt teiste keelte praktikast aga ei ole PHP-s vaja (vähemalt algtasemel) muretseda muutuja tüübi pärast - muutujaid eri pea deklareerima (nagu C-s või Pascalis) ning ei kasutata isegi eri prefikseid (nagu BASICus $tekst, %täisarv, #reaalarv). PHP muutujad algavad kõik ühtmoodi dollarimärgiga, olenemata tüübist. Andmetüüpidest on veidi pikemalt juttu edaspidi.
Muutujanimed, erinevalt paljudest muudest keeleelementidest, on tõstutundlikud - $nimi ja $Nimi on kaks erinevat muutujat. Muutuja tüüp tuletatakse kontekstist ja teinekord võib siin esineda ka esmapilgul päris arusaamatuid avaldisi - näiteks annab avaldis 2+2*"lollus"+TRUE väärtuseks 3, mitte vea (teksti tõlgendatakse 0-na, TRUE-tõeväärtust aga 1-na - avaldist loetakse seega 2+2*0+1).
Muutujate nimed võivad sisaldada suur- ja väiketähti, numbreid ning allkriipsu. Nimi ei tohi alata numbriga.
Muutujale väärtuse andmine (omistamine) käib nagu enamikus keeltes võrdusmärgi abil ($summa = $esimene + $teine). Nagu C-s, kasutatakse ka PHP-s võrdlustehte ja omistuse eristamiseks võrdluses KAHT võrdusmärki:
if(summa == 3)
print ("Valmis");
Plokki kasutatakse kõige sagedamini lausete grupeerimiseks valiku- või korduslause alla:
tee_midagi
tegevus1
tegevus2
tegevus3
kuni_x=25
PHP kasutab ploki tähistamiseks looksulge nagu C (võrdluseks Pascali BEGIN ja END). Plokid võivad paikneda ka üksteise sees.
Kommentaar on programmi lisatud selgitav tekst, mida programm oma töös ignoreerib ning mis on mõeldud vaid programmiteksti paremaks mõistmiseks. PHP kasutab siin kolme võimalikku varianti:
/* kommentaar algab siit... jätkub jätkub jätkub ja lõpeb siin */
See sobib suuremate kommentaariplokkide lisamiseks ja ka programmi katsetamisel mingi osa ajutiseks väljalülitamiseks ("väljakommenteerimine"). Sedasorti kommentaare ei saa paigutada üksteise sisse.
# kommentaar
või
// kommentaar
Esimene toodud variantidest pärineb Perlist, teine C++-st. Mõlemaid võib kasutada nii kogu rea pikkuseks kommentaariks kui ka programmirea lõppu kommentaari paigutamiseks:
...
# Siit algab väljastamine
...
print("x väärtus on $x"); // väljastab lõpptulemuse
...
PHP töötab enamiku ajast vaikselt kuskil "tagaruumis" - nähtava tulemuse saamiseks peab kasutama väljastusmehhanisme. Kaks peamist väljastuslauset PHP-s on echo ja print.
Mõlemad on PHP-s (erinevalt C-st) keele osad, mitte standardfunktsioonid. Seega võib neid kasutada nii sulgudega kui ilma.
Lihtsaim kasutus on mingi teksti väljastamine kasutaja brauserisse:
echo "see tekst kirjutatakse kasutaja brauserisse";
Sama võib teha ka sulge kasutades:
echo ("see tekst kirjutatakse kasutaja brauserisse");
Ilma sulgudeta echo võib väljastada ka mitu komadega eraldatud argumenti:
echo "see tekst", " kirjutatakse kasutaja", " brauserisse"
NB! Sulgudega echo seda ei võimalda!
Echo'ga võrreldes on kaks erinevust:
Tehniliselt on print mõeldud tekstandmete väljastamiseks. PHP tüüpide paindlikkuse tõttu aga ei ole praktiliselt mingit vahet - teised tüübid teisendatakse vahetult enne print'i tekstiks. Seega print("3.141592") ja print(3.141592) väljastavad praktikas sama tulemuse.
Nagu enamik teisi keeli, kasutab ka PHP neid märke tekstiväärtuste esitamiseks. PHP üheks väga mugavaks võimaluseks on aga muutujate põimimine teksti sisse - kui muutuja $loom väärtuseks on "kass", siis lause print("Mul on kodus $loom"); väljastab teksti "Mul on kodus kass". Seda juhul, kui kasutati jutumärke - ülakomad väljastavad teksti originaalkujul, ilma eeltöötluseta, ning annaksid tulemuseks "Mul on kodus $loom".
C eeskujul saab ka PHP-s kasutada juhtsümboleid reavahetuse, tabulatsiooni jms. esitamiseks. Eriti vajalikuks osutub see siis, kui peame genereerima PHP-s HTML-koodi (vajalik dünaamilise, kontekstist sõltuva veebilehe puhul!). Näiteks kui soovitakse genereerida juba eespool nähtud veebilehe "sõrestikku":
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xml:lang="et" lang="et" xmlns="http://www.w3.org/1999/xhtml">
<?php print("tere-tere, maakera!"); ?>
</html>
siis võime kirjutada PHP-programmi:
<?php
print("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?\&rt;");
print("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"&rt;");
print("<html xml:lang=\"et\" lang=\"et\" xmlns=\"http://www.w3.org/1999/xhtml\"&rt;");
print("tere-tere, maakera!");
print("(</html&rt;");
?>
Tähelepanuks:
Tulemus aga on selline:
<?xml version="1.0" encoding="iso-8859-1"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xml:lang="et" lang="et" xmlns="http://www.w3.org/1999/xhtml">dokumendi tekst</html>
Kogu kood kirjutati kokku ühele reale. Milles asi? Nagu ka HTML ei arvesta redaktoris tehtud reavahetusi ja need tuleb ette anda <br> -märgendiga, nii ei sünni need iseenesest ka siia. Soovitud kuju saame tulemusele anda reavahetussümboli \n lisamisega:
<?php
print("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?&rt;\n");
print("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"&rt;\n");
print("<html xml:lang=\"et\" lang=\"et\" xmlns=\"http://www.w3.org/1999/xhtml\"&rt;\n");
print("tere-tere, maakera!\n");
print("(</html&rt;\n");
?>
Nagu nägime, käib jutumärkide lisamine väljastatavasse teksti nii:
print("Ta ütles: \"See koer on hirmus kuri!\" ");
Siin \" väljastab teksti sisse jutumärgid, ajamata neid segi kogu teksti alguse ja lõpu jutumärkidega.
PHP on loodud eesmärgiga vabastada kasutaja suurest osast tüüpidega seotud problemaatikast ning see on ka õnnestunud. PHP-s on üldse vaid neli liht- ja kaks tuletatud andmetüüpi ning teisendamine on sageli automaatne. Tüübid on:
Suure ulatusega (vastab C-keele long-tüübile). Vaikimisi kasutatakse kümnendsüsteemi, kaheksandsüsteemi puhul peab arv algama nulliga ning kuueteistkümnendsüsteemi puhul "0x"-ga:
$kymnendarv = 204; $teinekymnend = -230; $kaheksand = 0400; $kuueteistkymnend = 0x1A43;
Reaalarve võib esitada tavalises vormingus täisosa.murdosa, kusjuures eraldi nullide kirjutamine pole kohustuslik:
$reaal = 2.0 on sama mis $reaal = 2. $reaal = 0.2 on sama mis $reaal = .2
Alternatiivina võib väga suuri või väga väikseid arve esitada ka eksponentsiaalkujul (ujukomaarvuna):
$pisike = 3.45e-16; $pirakas = 2.1e13;
Tõeliste tõeväärtustena sisaldab PHP4 (mitte aga eelmine versioon PHP3!) konstante TRUE ja FALSE, mille kõige tüüpilisem kasutusala on if-lause:
if(TRUE)
print("see lause täidetakse alati");
else
print("seda lauset ei täideta kunagi");
Loogikaväärtustena saab tõlgendada ka teisi väärtusi. Sel juhul:
NB! Ehkki sama loogika järgi peaks ka reaalarve saama kasutada tõeväärtusena, ei maksa seda teha - ümardamisprobleemide tõttu ei ole 0.0000 alati sama mis 0!
Nagu juba mainitud, kasutatakse PHP-s stringitähistena nii jutumärke kui ülakomasid, kuid nende funktsioon on erinev - ülakomade vahele kirjutatud avaldist tõlgendatakse täht-tähelt, jutumärkide korral asendatakse avaldises olevad muutujanimed vastavate muutujate väärtustega:
$nimi = "Jaan";
print('Minu nimi on $nimi'); // Minu nimi on $nimi
print("Minu nimi on $nimi"); // Minu nimi on Jaan
Mõlemal juhul võib teist märki stringi sees kasutada:
print('Isa ostis "Volvo" viimase mudeli');
print("Vanaema lendab neljapäevaöösiti 'Philipsi' tolmuimejaga");
Kui aga on vaja sama sümbolit ka teksti sisse, tuleb see esitada juhtsümbolina:
print("Vello sõidab \"Volvoga\"");
Lisaks jutumärkide ja ülakoma saab juhtsümbolitega esitada järgmisi elemente:
NB! Ülakomadega tekstis võib kurakaldkriipsu kirjutada kahel viisil - nii tähttäheliselt (ühekordsena) kui juhtsümbolina - see on ainus ülakomade vahel kasutatav juhtsümbol:
print('C:\\Windows\\System\\'); // kindlam variant!
print('C:\Windows\System\');
PHP massiivimõiste on mõnevõrra erinev teistes suurtes programmeerimiskeeltes kasutatavast. Tavapärane definitsioon - samasse muutujasse koondatud hulk samatüübilisi väärtusi - kehtib ka siin:
$foor[0] = "punane"; $foor[1] = "kollane"; $foor[2] = "roheline";
Tähelepanuks - massiivi elementide numeratsioon algab nullist!
PHP massiivimõiste on aga laiem. Siin võime anda väärtuse mõnele väga suure järjenumbriga massiivielemendile, ilma et oleks vaja muretseda mäluraiskamise pärast:
$kolesuurmassiiv[1000000] = "polegi nii suur";
PHP nimelt ei eralda kasutamata elementide alla mälu, seega eksisteerib see massiiv hoolimata suurest järjenumbrist üheelemendilisena.
Alustuseks märkus neile, kes tunnevad C-keelt - PHP-s kasutatavad juhtlaused on pea 100% samad mis C-s. Teistega alustame algusest. :-)
Valik või kordus toimuvad harilikult mingi tingimuse alusel. Tingimus aga eeldab võrdlemist ja alguseks mõned võrdluste põhimõtted.
Suur segaduse allikas on juba võrdlusmärk - "=" tähistab PHP-s (ja C-s) omistustehet, s.t väärtuse ülekandmist märgi paremalt poolt vasakule:
$pikkus = 176; // muutujale $pikkus antakse väärtus 176
Võrdlemiseks kasutatakse hoopiski topelt-võrdusmärki "==". Ka mittevõrdumise tähiseks ei ole "<>" nagu mitmes keeles, vaid "!=". Lisaks kasutatakse veel erinevust märkivaid "<", ">", "<=", ">=".
Keerulisemate võrdlemiste jaoks läheb vaja ka loogikaavaldisi. Need on PHP-s standardsed:
Nagu matemaatilises tehetejärjekorras, on ka PHP-avaldises oluline tehete prioriteet:
3 + 4 * 2 = 24 (3 + 4) * 2 = 14
Et and- ja or-tehete prioriteet on madal, siis on PHP-s olemas ka nende tehete kõrgema prioriteediga analoogid, vastavalt && ja || .
Tekstiväärtuste (stringide) võrdlemisel on võrdluse aluseks järjenumber tähestikus, kusjuures suurtähed on "suuremad" kui väiketähed.
Klassikaline valikulause on sama mis enamikus programmeerimiskeeltes - IF. PHP-s on selle üldkuju analoogiline C-ga:
if (tingimus) if ($arv > 0)
tegevus1; print("positiivne");
else else
tegevus2; print("negatiivne või null");
Sageli esineb ka mittetäielikku if-i, ilma else-osata.
Toodud näites on tegevusteks vaid üks lause. Kui soovitakse valida mitme lausega programmilõikude vahel, tuleb need paigutada looksulgude vahele:
if (tingimus)
{
esimene;
teine;
kolmas;
}
else
{
neljas;
viies;
}
Märkus: Siin on kasutatud muutujat $sugu, mille väärtuseks võib olla kas "mees" või "naine". Lihtsuse huvides oletame, et enne käesoleva programmi käivitamist on see väärtus mingil viisil juba sisestatud - siin tegeldakse vaid väärtuse kontrollimisega.
Programmi üldine loogika:
kui sugu on naine tee naiste lehekülg vastasel juhul tee meeste lehekülg
Programm:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xml:lang="et" lang="et" xmlns="http://www.w3.org/1999/xhtml">
<head>
<?php
if ($sugu == "naine")
{
?>
<title>Ainult naiste lehekülg</title>
</head>
<body bgcolor="magenta">
<h1>NB!</h1>
<p>See on ainult naiste veebileht. Ühelgi mehel pole siia asja!</p>
<?php
}
else
{
?>
<title>Ainult meeste lehekülg</title>
</head>
<body bgcolor="cyan">
<h1>NB!</h1>
<p>See on ainult meeste veebileht. Ühelgi naisel pole siia asja!</p>
<?php
}
?>
</body>
</html>
Lisaks if-lausele illustreerib see näide ilmekalt ühte PHP suurt iseärasust - võimalust "pendeldada" HTML-i ja PHP vahel lausa lausekonstruktsioonide keskpaigas. Programm algab HTML-moodis (kaks esimest rida), siis siseneb muutuja $sugu väärtuse kontrolliks PHP-moodi, kuid if-lause keskelt minnakse taas HTML-i - else-osa jääb programmi keskele ja lause lõpp hoopis programmi lõppu. Niisiis toimub programmi jooksul üleminek HTML-PHP-HTML-PHP-HTML-PHP-HTML.
Sellist "pendeldamist" saab vajaduse korral vähendada, viies kogu programmi PHP-moodi ja kirjutades ka kõik HTML-märgendid PHP print-lausete abil:
<?php
print("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?&rt;\n");
print("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"&rt;\n");
print("<html xml:lang=\"et\" lang=\"et\" xmlns=\"http://www.w3.org/1999/xhtml\"&rt;\n");
print("<head&rt;\n");
if ($sugu == "naine")
{
...
NB! print-lausetele on lisatud reavahetussümbol \n, vältimaks HTML-koodi genereerimist ühe pika joruna. Paneme ka tähele, et selles näites on ka < ja > -märgid kirjutatud kindluse mõttes vastavate HTML-i asenduskoodide abil - see pole enamasti siiski vajalik.
Millist stiili eelistada, sõltub tegijast ja olukorrast, võimalik on ka neid kaht lähenemist igapidi kombineerida. Suure veebisaidi korral tasub võimaluse korral eelistada esimest stiili - HTML oma puhtal kujul on kiirem kui märgendite kirjutamine print-lausete abil. Samas on teine stiil ülevaatlikum (sarnaneb rohkem traditsiooniliste programmeerimiskeeltega) ja mõnevõrra lihtsam lugeda.
Kui alternatiive on rohkem kui kaks, võib esiteks pruukida if-lause täiendatud versiooni. Siin on üldine kuju järgmine:
if (tingimus1) if ($arv > 0)
tegevus1; print("positiivne");
elseif (tingimus2) elseif ($arv < 0)
tegevus2; print("negatiivne");
elseif (tingimus3) elseif ($arv == 0)
tegevus3; print("null");
...
NB! Siin läbitakse kõik sobivate tingimustega variandid - esimese sobiva järel lahkumiseks tuleb lisada break-lause (sellest lähemalt allpool).
Teiseks, klassikalisemaks mitmendvaliku lauseks, mida üldiselt tuntakse case-lausena, on PHP-s C eeskujul switch. Selle üldkuju on järgmine:
switch (avaldis) switch ($arv)
{ {
case väärtus1: case >0:
laused1 print("positiivne");
case väärtus2: case <0:
laused2 print("negatiivne");
... case 0:
default: print("null");
laused }
}
Seega toimub siin kontrollitava avaldise (tüüpiliselt muutuja) väärtuse võrdlemine etteantud kontrollväärtustega ja vastavad tegevused. Default-osa määrab vaikimisi tegevused, mis tehakse igal juhul, kui eespool ei ole määratud teisiti.
Tähelepanu!
switch ($arv)
}
case >10:
print("üle kümne");
break;
case 100:
print("sada");
break;
case <0;
print("negatiivne");
break;
case 0:
print("null");
break;
default:
print("vahemikus 1-9");
}
Selle lause puhul sõltub väljastatav tulemus break-ide olemasolust - kui arv on 100, väljastatakse ilma break'ideta juhul nii "üle kümne" kui "sada". Break-lausete kasutamisel aga väljastatakse vaid "üle kümne" - kohe esimene variant täidab kriteeriumi ja break lõpetab valikulause töö. Break'ide kasutamise korral täidab default-osa else'i rolli - sealsed laused täidetakse vaid juhul, kui väärtus ei vasta ühelegi eelnevale kriteeriumile.
ALuua lehekülg, mis on erineva kujunduse ja tekstiga vastavalt kellaajale. Selleks on parim kasutada üsna mitmekülgset funktsiooni date(), mis lisaks kuupäevale võib väljastada ka kellaega (sõltub parameetritest). Näiteks
$kellaaeg_tundides_24h = date("H");
$kellaaeg_tunnid_ja_minutid ?= "date("H:i");
Täpsem info ajafunktsioonidest vt. [L] PHP manuaalist.
Korduslause olemasolu peetakse mõõdupuuks, mis eristab lihtsaid skriptikeeli "päris" programmeerimiskeeltest. Valikulause ja määramatu korduse olemasolu võimaldab programmeerimiskeelt kasutada enamiku lihtsamate ülesannete lahendamisel.
Määratud korduslause on lause, mida täidetakse täpselt ettenähtud arv kordi ning see arv on programmikoodist selgesti välja loetav. Määramatu korduslause täitmiste arv sõltub etteantud tingimusest ning ei ole seega otseselt ette näha, sõltudes enamasti korratavast lausest või lausetest.
NB! Nagu C-s, puudub PHP-s otseselt määratud korduslause. PHP for-lause on erinevalt BASICu või Pascali for-lausest samuti tingimuspõhine. Vaatleme aga kõiki variante nüüd lähemalt.
While-kordus
Kõige lihtsam kordusevariant on while-lause. Selle üldkuju on järgmine:
while (tingimus) while ($x < 5) korratav lause või laused $x = $x + 1;
Nagu if-lause juures nähtud, võib ka while-lauses kasutada nii üksikut lauset kui looksulgude vahele paigutatud lauseteplokki:
$summa = 0;
while ($summa < 10)
{
$summa = $summa + 1;
print("Summa on nüüd $summa.");
}
See programmilõik väljastab tekstid "Summa on nüüd 1", "Summa on nüüd 2"... kuni "Summa on nüüd 9". Vahel kasutatakse ka nn. igavest kordust, kus korduse arv ei ole teada (sel juhul on kordusploki sees sätestatud lõpetamise tingimus, vältimaks programmi töölejäämist):
while (TRUE)
print("See muudkui prindib ja prindib ja prindib...");
Teoreetiliselt on võimalik ka mitte kunagi täidetav kordus while (FALSE), kuid praktiliselt pole sel tähtsust (v.a. juhul, kui püsiväärtuse FALSE asemel on sama väärtust omav muutuja).
While-lausega saab luua nii määratud kui määramatu korduse. Eespooltoodud summanäide oli sisuliselt määratud kordus - ette oli antud nii algväärtus (0), lõputingimus (<10) kui muutumise samm (1), millest saab kergesti kokku tuletada täitmiste arvu. Ent kordus võib olla ka selline:
while($veel != "aitab küll!")
{
programm
}
Sellise mehhanismi kasutamine võib olla sobiv näiteks mõne mängu juures, kus peale mängu lõppu küsitakse kasutajalt, kas ta soovib veel mängida. Iga mänguseansi alguses aga ei ole ette teada, mitu mängu kasutaja teeb - seega on tegu määramatu kordusega.
Et while-korduse puhul kontrollitakse kõigepealt tingimust ja alles seejärel täidetakse kordusplokk, nimetatakse while-kordust ka eelkontrolliga korduseks. On aga olemas ka järelkontrolliga kordus - variant, kus esmalt täidetakse kordusplokk ja alles siis kontrollitakse tingimust. Selle üldkuju on:
do do korratav lause või laused $x = $x + 1; while (tingimus); while ($x < 5);
Sellise korduse omapäraks on asjaolu, et kordusplokki täidetakse alati vähemalt üks kord. Näiteks programmilõigus
$x = 49; do $x = x - 1; while (x > 50);
ei saagi tingimus olla täidetud (algväärtus on juba 50-st väiksem ja korduslause hakkab seda vähendama), sellest hoolimata täidetakse kordust üks kord ning $x lõppväärtuseks jääb 48.
See on PHP kõige keerulisem korduslause. For-lause üldkuju on järgmine:
for (algväärtustamine; jätkamistingimus; korduse lõpulause )
kordusplokk
Konkreetne näide:
for ($x = 1; $x < 10; $x++)
print ("X väärtus on $x.");
Täitmise käik on järgmine: esmalt ja vaid üks kord toimub algväärtustamine ($x saab väärtuseks 1), seejärel kontrollitakse jätkamistingimust. Kui jätkamistingimus on väär ($x on suurem kui 10), lõpetab lause töö, vastasel juhul täidetakse kordusplokk. Viimaseks sammuks on korduse lõpulause täitmine, mille järel kordus teeb järgmise sammu alates jätkamistingimuse kontrollist.
Kõlab keeruliselt... Tegelikult aga töötab eespooltoodud näide nii:
For-lause iga osa võib omakorda olla mitmeosaline, seega võib sisuliselt kontrollida kaht väärtust korraga (sel juhul on väärtused eraldatud komaga). Ka selles näites on pikem avaldis $y = $y - 4 ($y vähendamine 4 võrra) asendatud lühema kujuga $y -= 4.
for ($x = 1, $y = 50; $x < 10, $y > 0; $x++, $y -= 4)
print ("X väärtus on $x ja Y väärtus $y").
Sellisel juhul lõpetab korduse töö see muutuja, mille puhul jätkamistingimus esimesena vääraks osutub. Seda kordust täidetakse 9 korda - siis on $y väärtus jõudnud küll alles 14-ni, kuid $x väärtus on 10 ja tema jätkamistingimus muutub vääraks, seega lõpetab kordus töö.
Igal kordusel võivad esineda mingid erijuhud, mil tuleb töö katkestada. Selliseks lauseks on PHP-s
$x = 0;
while ($x < 10)
{
print ("X on $x.")
if ($x == 4)
{
print ("Oi, juba 4. Jätame järele!");
break;
}
$x++;
}
Ehkki see kordus peaks while-lause tingimuse järgi töötama kuni X väärtuseni 9, lõpeb reaalselt töö ära juba 4 peal - break katkestab korduse töö.
Vahel võib tekkida vajadus katkestada korduse käimasolev ring. Selleks on continue-lause, mis loeb käsiloleva korduseringi tehtuks ning alustab kohe uut. Näiteks for-kordus
for ($x = 1; $x < 10; $x++)
print ("X on $x.");
väljastab meile järjest laused "X on 1", ... , "X on 9". Lisades siia juurde aga kahega jagamise jääki kontrolliva lause, saame vaid paarisarve väljastava korduse:
for ($x = 1; $x < 10; $x++)
{
if ($x % 2 != 0) // kui $x annab 2-ga jagades jäägi, st on paaritu
continue;
print ("X on $x.");
}
Ülesanne: Kuidas oleks paarisarve lihtsam väljastada kui ülaltoodud näites?
Vahel tuleb programmi ette näha ka töö katkestamine (näiteks sisestas kasutaja kolm korda järjest vale parooli). Lihtne lõpetusfunktsioon on exit(), mis ei vaja ka parameetreid. Sageli aga on kasulik anda töö lõpetamisel teada ka põhjus, miks seda tehakse. Seda võimaldabki die-funktsioon, mille parameetrina saab anda ka veateate:
die("Parool on antud kolm korda valesti. Aitab naljast!");
Ülesanne: teha PHP-programm, mis väljastab HTML-tabelina korrutustabeli.
See teema läheb nüüd mingitpidi tagasi HTMLi juurde - täpsemalt HTMLi nende funktsioonide juurde, mida enamasti kasutatakse koos väliste programmidega (mida üldmõistena tuntakse CGI nime all).
HTML (täpsemalt küll veebi aluseks olev HTTP-protokoll) ei ole mõeldud oleku säilitamiseks - veebis ühelt lehelt teisele liikudes ei saa anda üleminekuga kaasa mingeid parameetreid või infot. Mingit lehekülge külastades on iga külastus omaette sündmus, mingit seost nende vahel ei ole. Ei ole ka vahet kas mingi veebisaidi alamlehele minnakse linkipidi pealeheküljelt või otse brauserisse lehe aadressi sisestades.
Nii on HTML-is olemas märgendid sisestusvormide loomiseks, kuid seniajani on nende kasutamine eeldanud mingis muus keeles (näiteks Perl) kirjutatud töötlusskripti olemasolu - paljalt HTML-vorm ei suuda midagi korda saata. See valdkond ongi nüüd saanud PHP üheks suuremaks kasutusalaks.
Enne PHP juurde asumist peaksime aga tutvuma HTMLi vormitehnikaga. Üldiseks märgendiks on <form>, millel on palju lisamärgendeid ja parameetreid. Vaatleme neid lähemalt.
form-märgendi kaks olulist parameetrit on action ja method. Action määrab vormi töötluseks kasutatava programmi, method andmete edastamiseks pruugitava meetodi (neid on kaks, get ja post, mõlemast tuleb juttu edaspidi). Seega on tüüpilise form-märgendi kuju järgmine:
<form action="arvuta.php" method="get">
form-märgendiga saab luua mitmesuguseid standardseid sisestusmehhanisme - sisestuslahtreid, valikunuppe, märkeruute jms. Konkreetse mehhanismi määramiseks kasutatakse omaette märgendeid form- märgendi sees, viimane toimib n.ö. metamärgendina ehk konteinerina.
Üldkuju on selline:
<input type="text" name="lahtri nimi" size="lahtrisuurus" value="vaikimisiväärtus">
size ja value -argumendid ei ole kohustuslikud.
Lisaks vormi valikulistele elementidele on üldiselt kohustuslik ka vormi käivitusnupu loomine, millele vajutamine käivitab vormi action-parameetriga määratud töötlusprogrammi. Nupu loomine toimub viimase operatsioonina vormi kirjelduse lõpus järgmiselt:
<input type="submit" value="nupule kirjutatud tekst">
Seega võiks lihtne sisestusvorm näha välja nii:
<form action="ruutjuur.php" method="get"> Sisesta arv, mille ruutjuurt soovid: <input type="text" name="juur"> <input type="submit" value="Arvuta ruutjuur">
Luuakse järgmise input-märgendiga:
<input type="radio" name="valiku nimi" value="tekst nupu juures">
Võib lisanduda veel atribuut checked, mis määrab vaikimisi valitud (kui kasutaja ei vali muud nuppu) nupu. NB! Checked kui algselt üksikatribuut tuleb XHTMLi reeglite tõttu kirjutada seal kujul checked="checked"!
Luuakse nii:
<input type="checkbox" name="valiku nimi" value="tekst kasti juures">
Nagu eelmise variandi juures, saab ka siin kasutada lisaatribuuti checked.
Nagu tavaline sisestuslahter, ent teksti ei näidata.
<input type="hidden" name="lahtri nimi" value="vaikimisi väärtus">
Nagu eelmine, kuid sisestatavat teksti näidatakse tärnidena.
<input type="password" name="lahtri nimi" size="pikkus" value="vaikimisi väärtus">
Erinevalt teistest luuakse mitte input-, vaid select-märgendiga ning iga valiku määramiseks on option-märgend. Üldkuju on selline:
<select name="menüünimi" size="korraga näidatavate valikute arv"> <option value="esimene valik"> <option value="teine valik"> ... <option value="n-es valik"> </select>
Vaikimisi valitud väärtust saab määrata, lisades vastavale option-ile atribuudi selected (mis tuleb XHTML-is jällegi kirjutada topelt: selected="selected"). Size võimaldab meil kujundada erinevaid menüüsid - size="1" annab rippmenüü, suurem väärtus aga tavapärase popup-tüüpi menüü (kui size on suurem või võrdne option-ite arvuga) või keritava menüü (kui size on väiksem).
Mäluga veebilehe loomiseks on mitmeid tehnikaid, kuid siinkohal vaatleme neist vaid kaht - GET- ja POST- meetodit. Alustame lihtsamast.
Siin antakse vajalikud väärtused ehk parameetrid edasi ühe osana URL-ist (ehk rahvakeeles veebiaadressist). Näiteks
http://www.kakupesa.pri.ee/~kakk/test.php?vastus=1
Siin käivitatakse programm test.php ja antakse kaasa parameeter, mille väärtus on 1.
Teeme väikese näite - nimelise tervitamise. Olgu meil järgmine lehekülg (nimetame ta vorm.html-iks), mis küsib kasutaja nime:
<?xml version="1.0" encoding="iso-8859-1"?< <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xml:lang="et" lang="et" xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Nimi</title> <body> <form action="tere.php" method="get"> <input type="text" name="nimi" value="Nipitiri" size="20"> <input type="submit" value="Sisesta nimi"> </form> </body> </html>
Nüüd kirjutame vastava töötlusprogrammi:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xml:lang="et" lang="et" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Tere!</title>
<body>
<?php
print("Tere, $nimi!");
?>
</body>
</html>
Avades brauseris vorm.html-i ja sisestades "Nipitiri" asemel mingi nime (võib aga jätta ka "Nipitiri"!), tervitatakse meid järgmisel ekraanil meie poolt sisestatud nimega. Oluline on mõista, mismoodi väärtus üle kanti. Vastava välja name-parameetri väärtuse järgi (nimi) lõi PHP vastava muutuja ($nimi - samanimeline kui name-i väärtus!), mida siis töötlusprogrammis kasutatakse.
Üldjuhul tähendab see lihtsalt teistsugust parameetrite edastamise mehhanismi - neid ei lisata enam väljakutsutava programmi URL-i, vaid edastatakse nähtamatult (kasutades süsteemseid muutujaid). Koodi osas vahet ei ole - võime eelnevas näites asendada method="get"-i method="post"-iga ja välja arvatud nähtav parameeter, peaks muu töötama samamoodi kui enne.
1. Teha samasugune tervitusvorm menüüd kasutades (menüüst võib tervitamiseks valida 4-5 erinevat nime).
2. Kasutades eespoolkirjeldatud tehnikaid, teha 5 vabalt valitud küsimusega viktoriin, mille vastuste sisestamisel kontrollitakse tulemused, loetakse punktid kokku ja antakse kasutajale teada.
PHP põhiveebi Eesti peegelsait
Wikipedia: PHP
PHP redaktorid
1995-2012, Kaido Kikkas
Käesoleva dokumendi paljundamine, edasiandmine ja/või muutmine on sätestatud kas GNU Vaba Dokumentatsiooni Litsentsi versiooni 1.2 või uuemaga (Litsentsi ingliskeelne täistekst) või Creative Commonsi Autorile viitamine + Jagamine samadel tingimustel 3.0 Eesti litsentsiga
1995-2012, by Kaido Kikkas. This document is distributed under either GNU Free Documentation License (v1.2 or newer) or Creative Commons Attribution-ShareAlike 3.0 Estonia license.