OSA II Kieli. Oppitunti. 4. Rakennuslohkot 5. Ohjelman kulku 6. Funktiot 7. Taulukot 8. Oliot

Samankaltaiset tiedostot
Java-kielen perusteet

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Java-kielen perusteet

OPPITUNTI 5 Ohjelman kulku

Tietotyypit ja operaattorit

3.1 Mitä tarkoittaan heredoc? Milloin sitä kannattaa käyttää? Kirjoita esimerkki sen käyttämisestä.

13. Loogiset operaatiot 13.1

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Python-ohjelmointi Harjoitus 2

Ohjelmoinnin perusteet Y Python

6. Funktiot 85. Kuinka funktioita määritellään ja kutsutaan. Kuinka funktioille viedään arvoja ja niistä palautetaan arvoja

1 PHP-sovelluksen toiminta

OPPITUNTI 3 Ensimmäinen skripti

4. oppitunti. Ilmaukset ja ohjelmalauseet. Osa

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin perusteet Y Python

Harjoitustyö: virtuaalikone

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

3. Muuttujat ja operaatiot 3.1

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

13. Loogiset operaatiot 13.1

Ohjausjärjestelmien jatkokurssi. Visual Basic vinkkejä ohjelmointiin

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit.

PHP tehtävä 3 Atte Pekarinen TIKT13A

OPPITUNTI 16 Tiedon käsittely

Java-kielen perusteita

Osoitin ja viittaus C++:ssa

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

7. Näytölle tulostaminen 7.1

Muuttujatyypit ovat Boolean, Byte, Integer, Long, Double, Currency, Date, Object, String, Variant (oletus)

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

Johdatus Ohjelmointiin

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Javascript 2: Ohjelmointikielen ominaisuudet. Jaana Holvikivi Metropolia

Kielioppia: toisin kuin Javassa

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Ohjelmointiharjoituksia Arduino-ympäristössä

Ehto- ja toistolauseet

Harjoitus 3 (viikko 39)

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

16. Ohjelmoinnin tekniikkaa 16.1

Ohjelmoinnin peruskurssi Y1

Sisällys. 17. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. for-lause lyhemmin

Sisällys. 16. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. Aritmetiikkaa toisin merkiten

Javan perusteita. Janne Käki

Ohjelmoinnin peruskurssi Y1

16. Ohjelmoinnin tekniikkaa 16.1

Ohjelmoinnin perusteet Y Python

Tyyppejä ja vähän muutakin. TIEA341 Funktio ohjelmointi 1 Syksy 2005


Ohjelmoinnin perusteet Y Python

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Ohjelmoinnin peruskurssi Y1

Ehto- ja toistolauseet

Erittäin nopea tapa saada kehitysympäristö php:lle pystyyn Voidaan asentaa muistitikulle

Ohjelmoinnin peruskurssi Y1

Muuttujat ja kontrolli. Ville Sundberg

etunimi, sukunimi ja opiskelijanumero ja näillä

Tutoriaaliläsnäoloista

Ohjelmoinnin peruskurssi Y1

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

ITKP102 Ohjelmointi 1 (6 op)

Taulukot. Jukka Harju, Jukka Juslin

Palvelinpuolen ohjelmointi

Sisältö. 2. Taulukot. Yleistä. Yleistä

Ohjelmoinnin peruskurssi Y1

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Ohjelmoinnin peruskurssi Y1

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Sisällys. 6. Muuttujat ja Java. Muuttujien nimeäminen. Muuttujien nimeäminen. salinovi tai syntymapaiva

6. Muuttujat ja Java 6.1

Ohjelmoinnin peruskurssi Y1

12 Mallit (Templates)

Palautetta viime luennosta

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

ITKP102 Ohjelmointi 1 (6 op)

Tietotyypit ja lausekkeet. Lewis & Loftus & Jukka Juslin 1

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat ja operaatiot

Sisällys. 6. Muuttujat ja Java. Muuttujien nimeäminen. Muuttujien nimeäminen. salinovi tai syntymapaiva

6. Muuttujat ja Java 6.1

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Sisällys. 6. Muuttujat ja Java. Muuttujien nimeäminen. Muuttujien nimeäminen. Muuttujien nimeäminen. Muuttujan tyypin määritys. Javan tietotyypit:

7. Taulukot 105. Kuinka taulukoiden tietoa käsitellään ja lajitellaan

JavaScript alkeet Esimerkkikoodeja moniste 2 ( Metropolia)

ICT1TN004. Skriptikielet. Heikki Hietala

Sisältö. 22. Taulukot. Yleistä. Yleistä

Transkriptio:

43 OSA II Kieli Oppitunti 4. Rakennuslohkot 5. Ohjelman kulku 6. Funktiot 7. Taulukot 8. Oliot

4. Rakennuslohkot 45 OPPITUNTI 4 Rakennuslohkot Tällä tunnilla joudut paneutumaan itse ohjelmointikieleen. Tarvitset paljon perustietoa ja jos olet aloitteleva ohjelmoija, saatat yllättyä tiedontulvasta. Älä kuitenkaan huolestu, voit aina palata tutkimaan asioita myöhemmin. Keskity nyt pikemminkin kielen ominaisuuksien ymmärtämiseen kuin muistamiseen. Jos olet kokenut ohjelmoija, voit ainakin selata läpi tämän tunnin aineiston. Tunnilla käsitellään muutamia PHP-kohtaisia piirteitä. Tunnin aiheita ovat Mitä muuttujat ovat ja kuinka niitä käytetään Kuinka muuttujia määritellään ja käsitellään Tietotyypeistä Yleisimmät operaattorit Kuinka operaattoreiden avulla luodaan lausekkeita Kuinka vakioita määritellään ja käytetään

46 4. Rakennuslohkot Muuttujat Muuttuja on varastopaikka, joka määritetään tallentamaan arvo. Muuttuja koostuu nimestä, jota edeltää taalamerkki ($). Muuttujan nimessä voi olla kirjaimia, numeroita ja alaviivaa (_). Nimissä ei saa olla välilyöntejä tai muita kuin aakkosnumeerisia merkkejä. Seuraavilla riveillä määritellään joitakin hyväksyttyjä muuttujia: $a; $a_longish_variable_name; $2453; $sleepyzzzz Muista, että puolipiste (;) päättää aina PHP-lauseen. Edellä olevilla riveillä puolipisteet eivät liity muuttujien nimiin. Muuttuja tallentaa tietyntyyppistä tietoa. Siihen voidaan sijoittaa numeroita, merkkijonoja, olioita, taulukoita ja boolean-arvoja. Muuttujan sisältöä voidaan muuttaa milloin tahansa. Kuten sait edellä tietää, muuttujan nimeämisessä on paljon valinnaisuutta, vaikka onkin epätavallista, että nimessä esiintyy pelkästään numeroita. Muuttujan esittelyyn riittää, että muuttujanimi sisällytetään skriptiin. Usein muuttujan esittelyn yhteydessä muuttujaan sijoitetaan myös arvo. $num1 = 8; $num2 = 23; Edellä olevilla riveillä esitellään kaksi muuttujaa, joihin sijoitetaan arvot sijoitusoperaattorilla (=). Saat lisätietoa sijoittamisesta jaksosta nimeltä Operaattorit ja lausekkeet. Sen jälkeen kun muuttujiin on sijoitettu arvot, niitä voidaan käsitellä samalla lailla kuin itse arvojakin. Toisin sanoen lause print $num1; on yhdenmukainen lauseen print 8; kanssa niin kauan kuin muuttujassa $num1 on arvo 8.

4. Rakennuslohkot 47 Dynaamiset muuttujat Kuten tiedät, voit luoda muuttujan kirjoittamalla taalamerkin ja sen jälkeen muuttujan nimen. PHP:ssä voidaan muuttujanimi tallentaa toiseen muuttujaan, mikä on hieman erikoista. Niinpä seuraava lause $user = "bob"; on yhdenmukainen seuraavien lauseiden kanssa: $holder="user"; $$holder = "bob"; Nyt $holder-muuttuja sisältää merkkijonon "user", joten voit ajatella, että tunnisteessa $$holder on taalamerkki arvon $holder edessä. PHP tulkkaa sen arvoksi $user. Voit käyttää merkkijonovakiota määrittämään dynaamisen muuttujan tavallisen muuttujan sijaan. Voit tehdä sen sijoittamalla muuttujanimenä käyttämäsi merkkijonon aaltosulkuihin: ${"user"} = "bob"; Menettely saattaa tuntua aluksi oudolta. Kuitenkin käyttämällä liittämisoperaattoria ja silmukkaa (katso lukua 5, Ohjelman kulku ), voit käyttää tätä tekniikkaa luomaan kymmeniä muuttujia dynaamisesti. Kun käsittelet dynaamista muuttujaa, syntaksi on sama kuin tavallisen muuttujan kohdalla. Lauseet $user ="bob"; print $user; ovat yhdenmukaisia lauseiden $user ="bob"; $holder="user"; print $$holder; kanssa. Jos haluat tulostaa dynaamisen muuttujan merkkijonon sisällä, sinun on kuitenkin autettava tulkkia hieman. Seuraava tulostuslause

48 4. Rakennuslohkot $user="bob"; $holder="user"; print "$$holder"; ei tulosta arvoa "bob" selaimelle, kuten odotit. Sen sijaan lause tulostaa merkkijonot "$" ja "user" eli "$user". Kun asetat muuttujan lainausmerkkeihin, PHP käyttää sen arvoa lauseessa. Tässä tapauksessa PHP korvaa muuttujanimen $holder merkkijonolla "user". Ensimmäinen taalamerkki jätetään paikoilleen. Jotta PHP saisi selville, että merkkijonon sisällä oleva muuttuja on osa dynaamista muuttujaa, se on laitettava aaltosulkujen sisälle. Seuraavan koodin tulostuslause $user="bob"; $holder="user"; print "${$holder}"; tulostaa nyt "bob", joka on muuttujan $user sisältämä arvo. Listaus 4.1 sitoo edellä esitetyt koodit yhteen skriptiksi, jossa merkkijono tallennetaan muuttujaan, jonka avulla muuttuja $user alustetaan ja jolla sitä käsitellään. Listaus 4.1 Muuttujien dynaaminen asettaminen ja käsittely 1: <html> 2: <head> 3: <title>listing 4.1 Dynamically setting and accessing variables</title> 4: </head> 5: <body> 6: <?php 7: $holder = "user"; 8: $$holder = "bob"; 9: 10: // olisi voinut olla: 11: // $user = "bob"; 12: // ${"user"} = "bob"; 13: 14: print "$user<br>"; // tulostaa "bob"

4. Rakennuslohkot 49 15: print $$holder; // tulostaa "bob" 16: print "<br>"; 17: print "${$holder}<br>"; // tulostaa "bob" 18: print "${'user'}<br>"; // tulostaa "bob" 19:?> 20: </body> 21: </html> Viittaukset muuttujiin Oletuksena muuttujiin sijoitetaan arvoja. Toisin sanoen, jos sijoitat muuttujaan $avariable arvon $anothervariable, menee muuttujaan $avariable kopio muuttujan $anothervariable arvosta. Jos muuttujaa $avariable muutetaan jälkeenpäin, muutos ei vaikuta muuttujan $anothervariable sisältöön. Listaus 4.2 havainnollistaa edellä kerrottua. Listaus 4.2 Muuttujiin sijoitetaan arvoja 1: <html> 2: <head> 3: <title>listing 4.2 Variables are assigned by value</title> 4: </head> 5: <body> 6: <?php 7: $avariable = 42; 8: $anothervariable = $avariable; 9: // kopio muutt. $avariable sisäll. menee $anothervariable-muuttujaan 10: $avariable = 325; 11: print $anothervariable; // tulostaa 42 12:?> 13: </body> 14: </html> Esimerkissä alustetaan muuttuja $avariable arvolla 42. Sitten muuttujan $avariable sisältö sijoitetaan muuttujaan $anothervariable. Nyt menee muuttujan $avariable arvon kopio muuttujaan $anothervariable. Jos muuttujan $avariable arvoksi laitetaan 325, muutos ei vaikuta muuttujan $anothervariable arvoon. Tulostuslause todentaa vielä tämän (tulostuu arvo 42).

50 4. Rakennuslohkot PHP4:ssä voidaan edellä kuvattua käyttäytymistä muuttaa siten, että sijoitetaankin muuttujan $avariable viittaus muuttujaan $anothervariable, eikä siis kopiota muuttujan sisällöstä. Listaus 4.3 havainnollistaa tätä menettelyä. Listaus 4.3 Muuttujan sijoittaminen viittauksena 1: <html> 2: <head> 3: <title>listing 4.3 Assigning a variable by reference</title> 4: </head> 5: <body> 6: <?php 7: $avariable = 42; 8: $anothervariable = &$avariable; 9: // kopio muutt. $avariable sisäll. menee muutt. $anothervariable 10: $avariable= 325; 11: print $anothervariable; // tulostaa 325 12:?> 13: </body> 14: </html> Olemme nyt lisänneet vain yhden yksittäisen merkin listauksen 4.2 koodiin. Kun sijoitamme et-merkin (&) muuttujan nimen eteen (&$avariable), toteutamme viittauksen muuttujaan. Tällöin sijoituslauseessa sijoitetaan vasemmalla puolella olevaan muuttujaan ($anothervariable) arvon kopion sijaan viittaus muuttujaan ($avariable). Nyt kaikki muuttujaan $avariable tehdyt muutokset näkyvät myös muuttujassa $anothervariable. Toisin sanoen molemmat muuttujat ($avariable ja $anothervariable) edustavat samaa muistipaikkaa. Koska tällä menettelyllä päästään irti kopioimisesta, ohjelman tehokkuus paranee. Tavallisessa skriptissä suorituskyvyn paranemista ei juurikaan kyllä havaita. Viittaukset on ominaisuus, joka tuli PHP4:n myötä. Tietotyypit Tietotyyppi vaikuttaa muistitilan tarpeeseen. Lisäksi eri tietotyyppiä olevia muuttujia voidaan kohdella eri tavoin skriptien sisällä. Jotkin ohjelmointikielet vaativat ohjelmoijan määrittämään muuttujan tietotyypin etukäteen. PHP4 on löysästi tyypitetty kieli, mikä merkitsee sitä, että tietotyyppi määritetään vasta sitten, kun muuttujaan sijoitetaan arvo. Menettelyssä on sekä hyvää että huonoa. Sen ansiosta muuttujia voidaan

4. Rakennuslohkot 51 käyttää joustavasti: muuttuja voi joskus sisältää merkkijonon ja joskus taas kokonaisluvun. Toisaalta tällainen ominaisuus saattaa aiheuttaa sekaannuksia laajassa skriptissä, kun muuttuja ei joissakin kohdin ohjelmaa käyttäydykään niin kuin sen pitäisi tai muuttujassa on odotetusta poikkeava arvo. Taulukko 4.1 esittelee PHP4:n kuusi tietotyyppiä. Taulukko 4.1 Tietotyypit Tietotyyppi Esimerkki Kuvaus Integer (kokonaisluku) 5 Kokonainen luku Double (desimaaliluku) 3.234 Liukuluku String (merkkijono) Terve Joukko merkkejä Boolean (totuusarvo) true Tosi (true) tai epätosi (false) Object (olio) Katso lukua 8, Oliot Array (taulukko) Katso lukua 7, Taulukot Tutkimme taulukoita ja olioita luvuissa 7 ja 8. Sen sijaan käsittelemme nyt vain neljä perustietotyyppiä. Voit käyttää PHP4:n sisäistä funktiota gettype() testaamaan minkä tahansa muuttujan tietotyypin. Muuttujan nimi sijoitetaan sulkumerkkien sisälle funktion kutsussa ja funktio palauttaa merkkijonon, joka kertoo tietotyyppiä. Listaus 4.4 sijoittaa neljä eri tietotyyppiä yksittäiseen muuttujaan ja tietotyyppi testataan sitten gettype()-funktiolla. Saat lisätietoa funktioiden kutsumisesta luvusta 6, Funktiot. Listaus 4.4 Muuttujan tyypin testaaminen 1: <html> 2: <head> 3: <title>listing 4.3 Testing the type of a variable</title> 4: </head> 5: <body> 6: <?php 7: $testing = 5; 8: print gettype( $testing ); // integer 9: print "<br>"; 10: $testing = "five"; 11: print gettype( $testing ); // string 12: print("<br>"); 13: $testing = 5.0;

52 4. Rakennuslohkot 14: print gettype( $testing ); // double 15: print("<br>"); 16: $testing = true; 17: print gettype( $testing ); // boolean 18: print "<br>"; 19:?> 20: </body> 21: </html> Skripti tuottaa seuraavan tulosteen: integer string double boolean Kokonaisluku on kokonainen tai todellinen numero. Siinä ei ole desimaalipistettä eikä desimaaliosia. Merkkijono on joukko merkkejä. Kun käsittelet merkkijonoja, ne tulee laittaa lainausmerkkeihin ( ) tai heittomerkkeihin ( ). Double on liukulukuarvo. Siinä voi olla desimaaliosia. Boolean-tyyppi voi saada arvon true tai false. Boolean-tyyppi tuli vasta PHP4:n mukana. Aiemmin true-arvo viittasi kokonaislukuun 1. Tyypin muuttaminen funktiolla settype() Funktion settype() avulla voidaan muuttujan tietotyyppiä muuttaa ohjelmassa. Muutettavan muuttujan nimi ja uusi tietotyyppi sijoitetaan pilkulla erotettuina sulkumerkkien sisälle funktion kutsussa. Listauksessa 4.5 muunnetaan arvo 3.14 (double) muiksi tyypeiksi. Listaus 4.5 Muuttujan tietotyypin muuttaminen funktiolla settype() 1: <html> 2: <head> 3: <title>listing 4.5 Changing the type of a variable with settype()</title> 4: </head>

4. Rakennuslohkot 53 5: <body> 6: <?php 7: $undecided = 3.14; 8: print gettype( $undecided ); // double 9: print " -- $undecided<br>"; // 3.14 10: settype( $undecided, string ); 11: print gettype( $undecided ); // string 12: print " -- $undecided<br>"; // 3.14 13: settype( $undecided, integer ); 14: print gettype( $undecided ); // integer 15: print " -- $undecided<br>"; // 3 16: settype( $undecided, double ); 17: print gettype( $undecided ); // double 18: print " -- $undecided<br>"; // 3.0 19: settype( $undecided, boolean ); 20: print gettype( $undecided ); // boolean 21: print " -- $undecided<br>"; // 1 22:?> 23: </body> 24: </html> Ohjelmassa käytetään gettype()-funktiota vahvistamaan, että tyypin muuttaminen onnistui; sen jälkeen tulostetaan muuttujan $undecided arvo. Kun muunnamme merkkijonon "3.14" kokonaisluvuksi, heitetään arvosta desimaaliosat pois lopullisesti. Siksi muuttujassa on edelleenkin arvo 3, vaikka olemme muuttaneet tietotyypiksi doublen. Viimeisessä muutoksessa laitamme tietotyypiksi boolean-tyypin. Muunnoksen yhteydessä nähdään arvo 0 arvona false ja kaikki muut numeroarvot arvona true. Boolean-arvon tulostuksessa vastaa arvoa true arvo 1 ja arvoa false tyhjä merkkijono. Tyypin muuntaminen pakkomuuntamalla Kun sijoitetaan sulkumerkkien sisällä oleva tietotyyppi muuttujan eteen, luodaan muuttujan arvosta kopio, joka on muunnettu halutun tyyppiseksi. Funktion settype() ja tyyppimuunnoksen pääerona on se, että tyyppimuunnos tuottaa kopion jättäen alkuperäisen muuttujan koskemattomaksi, kun taas settype() muuttaa alkuperäisen muuttujan tietotyypin. Listaus 4.6 havainnollistaa edellä kerrottua.

54 4. Rakennuslohkot Listaus 4.6 Muuttujan tietotyypin muuttaminen 1: <html> 2: <head> 3: <title>listing 4.6 Casting a variable</title> 4: </head> 5: <body> 6: <?php 7: $undecided = 3.14; 8: $holder = ( double ) $undecided; 9: print gettype( $holder ) ; // double 10: print " -- $holder<br>"; // 3.14 11: $holder = ( string ) $undecided; 12: print gettype( $holder ); // string 13: print " -- $holder<br>"; // 3.14 14: $holder = ( integer ) $undecided; 15: print gettype( $holder ); // integer 16: print " -- $holder<br>"; // 3 17: $holder = ( double ) $undecided; 18: print gettype( $holder ); // double 19: print " -- $holder<br>"; // 3.14 20: $holder = ( boolean ) $undecided; 21: print gettype( $holder ); // boolean 22: print " -- $holder<br>"; // 1 23:?> 24: </body> 25: </html> Nyt emme todellisuudessa muuttaneet lainkaan muuttujan $undecided tyyppiä, vaan se pysyy doublena koko ajan. Sen sijaan ulkoisen muunnoksen avulla teimme halutun tyyppisiä kopioita muuttujan arvosta. Uusi arvo sijoitettiin muuttujaan $holder. Muuttujan $undecided sisältö pysyi alkuperäisessä muodossaan; sitä ei muutettu samalla lailla kuin listauksessa 4.5.

4. Rakennuslohkot 55 Operaattorit ja lausekkeet Nyt osaat sijoittaa tietoa muuttujiin. Osaat myös tutkia ja muuttaa muuttujan tietotyyppiä. Ohjelmointikieli ei kuitenkaan ole kovinkaan hyödyllinen, jos emme pysty muuttamaan muuttujissa olevia arvoja. Operaattorit ovat symboleita, joiden avulla voidaan toteuttaa erilaisia toimintoja uusien arvojen tuottamiseksi. Arvoa, joka on tekijänä operaattorissa, kutsutaan operandiksi. Operaattori on symboli tai joukko symboleja, jotka suorittavat toiminnon yhdessä arvojen kanssa ja tuottavat yleensä uuden arvon. Operandi on arvo, jota operaattori käyttää. Operaattoriin liittyy yleensä kaksi operandia. Seuraava lauseke sisältää tutun operaattorin, johon liittyy kaksi operandia: 4 + 5 Nyt arvot 4 ja 5 ovat operandeja. Ne ovat yhteenlaskuoperaattorin osapuolia ja lauseke tuottaa nyt tuloksen 9. Operaattorit ovat melkein aina kahden operandin välissä, vaikkakin saat nähdä myös poikkeuksia myöhemmin tässä luvussa. Operaattorin ja operandien muodostamaa yhdistelmää kutsutaan lausekkeeksi (tai ilmaukseksi). Vaikka operaattorit ovat useimmiten muodostamassa lausekkeita, lausekkeen ei tarvitse sisältää operaattoria. Itse asiassa PHP:ssä lauseke on koodi, joka tuottaa (palauttaa) arvon. Lauseke voi siis olla kokonaislukuarvo (esim. 654), muuttujanimi (esim. $user) tai funktion kutsu (esim. gettype()). Siksi lauseke (4 + 5) on lauseke, joka sisältää kaksi muuta lauseketta ja operaattorin. Lauseke on mikä tahansa funktioiden, arvojen ja operaattoreiden yhdistelmä, joka tuottaa arvon. Peukalosääntönä voisi sanoa, että jos voit käyttää koodia tai tekstiä arvona, kyseessä on lauseke. Olemme nyt käsitelleet periaatteita ja voimmekin siirtyä PHP4:n yleisiin operaattoreihin. Sijoitusoperaattori Olet kohdannut sijoitusoperaattorin muuttujien alustamisen yhteydessä. Se koostuu yhtäsuuruusmerkistä (=). Sijoitusoperaattori sieppaa lausekkeen oikealla puolella olevan arvon ja sijoittaa sen vasemmalla puolella olevaan operandiin: $name ="matt"; Muuttuja $name sisältää nyt merkkijonon "matt". Tämäkin rakennelma on lauseke. Aluksi saattaa näyttää siltä, että sijoitusoperaattori vain muuttaa muuttujaa $name tuottamatta arvoa, mutta itse asiassa sijoitusoperaattori tuottaa kopion oikealla puolella olevasta operandista. Siten lause

56 4. Rakennuslohkot print ( $name = "matt" ); tulostaa merkkijonon "matt" samalla kun se sijoittaa arvon muuttujaan. Aritmeettiset operaattorit Aritmeettiset operaattorit toimivat juuri kuin voi odottaakin. Taulukossa 4.2 luetellaan nuo operaattorit. Yhteenlaskuoperaattori lisää oikean operandin vasempaan operandiin. Vähennyslaskuoperaattori vähentää oikean operandin vasemmasta. Kertolaskuoperaattori kertoo vasemman operandin oikealla operandilla. Jakojäännösoperaattori palauttaa jakojäännöksen, kun vasen operandi on jaettu oikealla operandilla. Taulukko 4.2 Aritmeettiset operaattorit Operaattori Operaattorin nimi Esimerkki Tulos + Yhteenlasku 10+3 13 - Vähennyslasku 10-3 7 / Jakolasku 10/3 3.3333 * Kertolasku 10*3 30 % Jakojäännös 10%3 1 Liittämisoperaattori Liittämisoperaattorin symboli on piste. Operaattorin operandeja käsitellään merkkijonoina ja oikealla puolella oleva operandi liitetään vasemmalla puolella olevaan operandiin. Niinpä "hello"." world" palauttaa "hello world" Huolimatta operandien tietotyypeistä niitä käsitellään merkkijonoina ja tuloksena on aina merkkijono. Lisää sijoitusoperaattoreita Vaikka todellisuudessa on olemassa vain yksi sijoitusoperaattori, PHP4 tarjoaa joukon yhdistettyjä operaattoreita, jotka sijoituksen yhteydessä myös muuttavat vasemmalla puolella olevaa operandia. Yleensä operaattorit käyttävät operandejaan muuttamatta niiden arvoja. Sijoitusoperaattorit sotivat tätä sääntöä vastaan. Yhdistetty sijoitusoperaattori sisältää aritmeettisen operaattorin, jota seuraa sijoitusoperaattori. Koodi on suppeampaa, kun yhdellä operaattorilla voidaan korvata kaksi eri operaattoria. Esimerkiksi

4. Rakennuslohkot 57 $x = 4; $x += 4; // $x on nyt 8 on identtinen seuraavien lauseiden kanssa: $x = 4; $x = $x + 4; // $x on nyt 8 Tällainen yhdistetty operaattori voidaan toteuttaa aritmeettisten operaattoreiden ja liittämisoperaattorin kanssa. Taulukko 4.3 luettelee yleisimmät yhdistetyt operaattorit. Taulukko 4.3 Joitakin yhdistettyjä sijoitusoperaattoreita Operaattori Esimerkki On sama kuin += $x += 5 $x = $x + 5 -= $x -= 5 $x = $x - 5 /= $x /= 5 $x = $x/5 *= $x *= 5 $x = $x * 5 %= $x %= 5 $x = $x % 5.= $x.= k $x = $x. k Jokaisessa taulukon esimerkissä muunnetaan nyt $x-muuttujan arvoa oikealla puolella olevan arvon avulla. Vertailuoperaattorit Vertailuoperaattorit testaavat operandejaan. Ne palauttavat totuusarvon true, jos testin tulos on tosi ja arvon false, jos testin tulos on epätosi. Tällaisia lausekkeita käytetään haarautumis- ja päätöksentekorakenteissa, esimerkiksi if- ja while-lauseissa. Tutustumme noihin rakenteisiin luvussa 5. Testataksemme, onko muuttujassa $x oleva arvo pienempi kuin 5, voimme käyttää pienempi kuin - operaattoria (<): $x < 5 Jos muuttujassa $x on arvo 3, antaa vertailu tuloksen true. Jos arvo on taas 7, on lausekkeen tulos false.

58 4. Rakennuslohkot Taulukko 4.4 luettelee vertailuoperaattorit Taulukko 4.4 Vertailuoperaattorit Operaattori Operaattorin selitys Esimerkki ($x on 4) < Pienempi kuin $x < 5 (true) <= Pienempi tai yhtäsuuri kuin $x <= 5 (true) > Suurempi kuin $x > 5 (false) >= Suurempi tai yhtäsuuri kuin $x >= 5 (false) == Yhtäsuuri kuin $x == 5 (false)!= Eri suuri kuin $x!= 5 (true) Näitä operaattoreita käytetään yleisimmin kokonaislukujen ja desimaalilukujen yhteydessä, vaikkakin yhtäsuuruusoperaattorilla voidaan vertailla myös merkkijonoja. Monimutkaisempien testien luominen loogisten operaattoreiden avulla Loogiset operaattorit testaavat totuusarvoja. Esimerkiksi or-operaattori palauttaa arvon true, jos joko vasen operandi tai oikea operandi on true. Lauseke true false palauttaisi arvon true. And-operaattori palauttaa arvon true, jos sekä vasen että oikea operandi on true. Siksi lauseke true && false palauttaa arvon false. Todennäköisesti et kuitenkaan käytä loogisia operaattoreita totuusarvovakioiden testaamiseen. Sen sijaan on järkevää testata kahta tai useampaa lauseketta, jotka palauttavat totuusarvon. Esimerkiksi lauseke ( $x > 2 ) && ( $x < 15 ) palauttaa arvon true, jos $x sisältää arvon, joka on suurempi kuin 2 ja pienempi kuin 15. Laitoin mukaan sulkumerkit, jotta koodia olisi helpompi lukea. Taulukko 4.5 luettelee loogiset operaattorit.

4. Rakennuslohkot 59 Taulukko 4.5 Loogiset operaattorit Operaattori Nimi Selitys Esimerkki OR True, jos vasen tai oikea tai molemmat ovat true true false (tulos on true) or OR True, jos vasen tai oikea tai molemmat ovat true true false (tulos on true) && AND True, jos vasen ja oikea ovat true true && false (tulos on false) and AND True, jos vasen ja oikea ovat true true and false (tulos on false) xor XOR True, jos vasen tai oikea on true true false (tulos on true)! NOT True, jos operandi on false!true (tulos on false) Miksi sekä or- että and-operaattoreista on kaksi eri versiota? Kysymys on suoritusjärjestyksestä, jota tutkimme hieman myöhemmin tässä jaksossa. Inkrementointi ja dekrementointi Ohjelmia kirjoitettaessa joudutaan usein kasvattamaan muuttujan arvoa yhdellä tai vähentämään muuttujan arvosta ykkönen. Yleensä näin tapahtuu silmukoita käytettäessä. Olemme jo käsitelleet kaksi tapaa toteuttaa nuo toiminnot. Voisimme käyttää yhdellä kasvattamiseen yhteenlaskuoperaattoria: $x = $x + 1; // $x kasvaa yhdellä Toinen tapa on käyttää yhdistettyä sijoitusoperaattoria: $x += 1; // $x kasvaa yhdellä Molemmissa tapauksissa sijoitetaan yhdellä kasvatettu arvo muuttujaan $x. Koska yhdellä kasvattaminen ja yhdellä vähentäminen ovat kovin yleisiä toimenpiteitä, on niitä varten kehitetty omat operaattorinsa: inkrementointi (++) ja dekrementointi (--). Nuo operaattorit voidaan sijoittaa muutettavan muuttujan vasemmalle (etuliitteeksi) tai oikealle puolelle (jälkiliitteeksi). Lause $x++; // $x kasvaa yhdellä kasvattaa muuttujaa $x yhdellä. Samalla lailla lause $x--; // $x vähenee yhdellä

60 4. Rakennuslohkot vähentää muuttujasta $x arvon 1. Jos näitä operaattoreita käytetään jälkiliitemuodossa ehdollisten operaattoreiden yhteydessä, operandia muutetaan testin suorittamisen jälkeen: $x = 3; $x++ < 4; // true Edellisessä esimerkissä muuttuja $x sisältää arvon 3, kun testaus $x++ < 4 suoritetaan. Niinpä testi palauttaa tuloksen true. Testin suorittamisen jälkeen muuttujaa $x kasvatetaan yhdellä. Joissakin tilanteissa saatat haluta suorittaa inkremennoinnin tai dekremennoinnin muuttujalle ennen testin suorittamista. Tällöin operaattoreita tulee käyttää etuliiteoperaattoreina eli operaattori tulee sijoittaa muutettavan muuttujan vasemmalle puolelle: ++$x; // $x kasvaa yhdellä --$x; // $x:ää vähennetään yhdellä Nyt kasvatus tai vähennys suoritetaan testilauseissa ennen testin suorittamista: $x = 3; ++$x < 4; // false Yllä muuttujaa $x kasvatetaan yhdellä ennen testin suorittamista. Testin tulos on false, koska arvo 4 ei ole pienempi kuin 4. Operaattoreiden prioriteetit Kun käytät operaattoria, tulkki lukee tavallisesti lauseketta vasemmalta oikealle. Monimutkaisissa lausekkeissa, joissa on useita operaattoreita, tilanne voi mutkistua. Katsotaanpa aluksi esimerkiksi seuraavaa helppoa tapausta: 4 + 5 Nyt sekaannuksen vaaraa ei ole. PHP vain lisää arvon 4 arvoon 5. Mutta entäpä sitten seuraava koodi? 4 + 5*2

4. Rakennuslohkot 61 Nyt meillä on ongelma. Jos kuljemme vasemmalta oikealle, lasketaan ensin summa 4 + 5, joka sitten kerrotaan arvolla 2, joten tulos on 18. Mutta nyt kertolasku suoritetaan ensin (5*2) ja tulokseen (10) lisätään arvo 4, joten lopputulos on 14. Jälkimmäinen ratkaisu on oikein ja niin myös PHP toimii: se liittää operaattoreihin suoritusjärjestykseen vaikuttavan prioriteetin. Nyt kertolaskuoperaattorilla on korkeampi prioriteetti kuin yhteenlaskuoperaattorilla, joten kertolasku suoritetaan ensin. Voit aina pakottaa PHP-tulkin toimimaan haluamallasi tavalla käyttämällä sulkumerkkejä: Lauseke (4 +5)*2 antaa tuloksen 18. Vaikka lauseke suoritettaisiinkin oikein prioriteettien perusteella, kannattaa tavallisesti käyttää sulkumerkkejä selventämään koodia ja varmistamaan suoritusjärjestys. Taulukko 4.6 kertoo operaattoreiden suoritusjärjestyksen; korkeimman prioriteetin omaava operaattori on ylimpänä. Taulukko 4.6 Tiettyjen operaattoreiden suoritusjärjestys (ylempi ennen alempaa) ++ -- (pakkomuunnos) / * % + - < <= => > == ===!= && = += -= /= *= %=.= and xor or Kuten taulukosta näet, operaattorilla or on alempi prioriteetti kuin operaattorilla. Samoin operaattori and on taulukossa alempana kuin &&-operaattori. Monimutkaisissa testilausekkeissa voisitkin käyttää alemman prioriteetin omaavia loogisia operaattoreita, jos haluaisit muuttaa lausekkeiden suorittamisjärjestystä. Se ei kuitenkaan ole aina hyvä idea. Seuraavat kaksi lauseketta ovat yhdenmukaisia, mutta alempaa lauseketta on helpompi lukea: $x and $y $z ($x && $y) $z Vakiot Muuttujat tarjoavat joustavan keinon tallentaa tietoa. Voit muuttaa niiden arvoja ja tiedon tyyppiä milloin tahansa. Jos haluat kuitenkin käyttää samaa arvoa kaikkialla ohjelmassa koko ohjelman suorittamisen ajan, voit määrittää vakion muuttujan sijaan. PHP:ssä vakio määritetään sisäisen define()-funktion avulla. Määrittämisen jälkeen ei vakion arvoa voi ohjelmassa muuttaa. Vakiota määritettäessä define()-funktiolle kerrotaan vakion nimi sekä sille annettava arvo. Nimi ja arvo annetaan funktion argumentteina, sulkumerkkien sisällä: define( "CONSTANT_NAME", 42 );

62 4. Rakennuslohkot Arvona voi olla pelkästään numeroarvo tai merkkijono. Yleinen kirjoittamissääntö kehottaa kirjoittamaan vakioiden nimet isoin kirjaimin. Vakioon viitataan kertomalla vakion nimi eikä siinä nyt käytetä taalamerkkiä. Listaus 4.7 määrittää ja käsittelee vakiota. Listaus 4.7 Vakion määrittäminen 1: <html> 2: <head> 3: <title>listing 4.7 Defining a constant</title> 4: </head> 5: <body> 6: <?php 7: define ( "USER", "Gerald" ); 8: print "Welcome ".USER; 9:?> 10: </body> 11: </html> Huomaa, että käytimme liittämisoperaattoria lisäämään vakiossa oleva arvo merkkijonoon "Welcome". Tämä johtuu siitä, että tulkki ei osaa erottaa vakiota ja merkkijonoa, joka on lainausmerkeissä. Esimääritetyt vakiot PHP tarjoaa automaattisesti joitakin sisäisiä vakioita ohjelmiesi käyttöön. Tällainen vakio on esimerkiksi FILE, joka palauttaa tulkin paraikaa lukeman tiedoston nimen. Vakio LINE palauttaa tiedoston rivimäärän. Nämä vakiot ovat hyödyllisiä virheilmoitusten generointiin. Voit myös esimerkiksi selvittää, mikä PHP-versio on käytössä vakion PHP_VERSION avulla. Se voi olla hyödyllistä, jos haluat rajoittaa skriptin ajamisen tiettyyn PHP-versioon. Yhteenveto Tällä tunnilla tutkimme joitakin PHP-kielen peruspiirteitä. Sait tietoa muuttujista ja siitä, kuinka niihin sijoitetaan arvoja sijoitusoperaattorilla. Opit tuntemaan tavalliset ja dynaamiset muuttujat. Opit sijoittamaan muuttujiin arvoja myös viittauksina. Sen jälkeen sait tutustua operaattoreihin ja niiden käyttämiseen lausekkeissa. Luvun lopussa sait tietoa siitä, kuinka vakioita määritellään ja käsitellään.

4. Rakennuslohkot 63 K&V K Miksi voi olla hyödyllistä tietää muuttujan tietotyyppi? V Tietotyyppi vaikuttaa usein siihen, mitä olet tekemässä. Saatat haluta varmistaa, onko muuttujassa kokonaisluku vai desimaaliluku esimerkiksi ennen matemaattisten lausekkeiden suorittamista. Tällaisia tilanteita tutkitaan hieman tarkemmin luvussa 16, Tiedon käsittely. K Tulisiko minun pitäytyä joissakin nimeämistavoissa, kun nimeän muuttujia? V Tavoitteenasi tulisi olla helppolukuinen ja selkeä koodi. Sellainen muuttuja kuin $ab123245 ei kerro mitään muuttujan tarkoituksesta skriptissä. Pyri lyhyisiin ja kuvaaviin muuttujanimiin. Muuttuja nimeltä $f ei varmaankin kerro paljoa muuttujan käytöstä ohjelmassa, kun palaat ohjelman pariin vaikkapa kuukauden kuluttua. Sen sijaan sellainen muuttujanimi kuin $filename saattaisi olla järkevämpi. K Pitäisikö minun opetella operaattoreiden prioriteettitaulukko? V Miksipä ei, mutta ainakin toistaiseksi sinulla saattaa olla hyödyllisempääkin tehtävää. Käyttämällä sulkumerkkejä lausekkeissasi voit varmistaa haluamasi suoritusjärjestyksen. Työpaja Työpaja tarjoaa pikakysymyksiä, joiden avulla voit kerrata läpikäytyä materiaalia. Yritä ymmärtää vastaukset ennen kuin jatkat seuraavaan lukuun. Vastaukset annetaan liitteessä A. Kysymyksiä 1. Mitkä seuraavista muuttujanimistä eivät ole sopivia? $a_value_submitted_by_a_user $666666xyz $xyz666666 $ counter $the first $file-name

64 4. Rakennuslohkot 2. Kuinka voisit käyttää merkkijonomuuttujaa, joka on luotu sijoituslauseessa $my_var = "dynamic"; luodaksesi muuttuja -muuttujan (dynaamisen muuttujan), johon sijoitetaan sitten arvo 4. Kuinka voit sitten käsitellä tuon uuden muuttujan sisältöä? 3. Mitä seuraava lause tulostaa? print gettype("4"); 4. Mitä seuraava koodi tulostaa? $test_val = 5.4566; settype( $test_val, "integer" ); print $test_val; 5. Mikä seuraavista ohjelmalauseista sisältää lausekkeen? 4; gettype(44); 5/12; 6. Mitkä kysymyksen 5 lauseet sisältävät operaattorin? 7. Minkä arvon seuraava lauseke palauttaa? 5 < 2 Mitä tietotyyppiä palautettu arvo on?

4. Rakennuslohkot 65 Toiminta 1. Luo skripti, joka sisältää ainakin viisi eri muuttujaa. Laita niihin erityyppisiä arvoja ja käytä sitten gettype()- funktiota kunkin tyypin tulostamiseen. 2. Sijoita arvoja kahteen muuttujaan. Käytä vertailuoperaattoreita testaamaan, onko ensimmäinen arvo - sama kuin toinen - pienempi kuin toinen - suurempi kuin toinen - pienempi tai yhtäsuuri kuin toinen Tulosta kunkin vertailun tulos selaimelle. Muuta sitten arvoja ja aja skripti uudelleen.

66 4. Rakennuslohkot