![]() |
|
||||||
|
|
| 29.07.10 / 21:53 |
|
Martin Rebane
Ilmselt igaüks on kasutanud tavalisi PHP funktsioone nagu strlen, isset, substr. Ilma funktsioonideta oleks ju PHP programmeerimine, nagu ka igasugune muu programmeerimine, mõeldamatu. Kui lihtsamad asjad saab vast PHP oma funktsioonidega ära aetud, siis keerulisemateks ülesanneteks jääb nendest väheseks. Siin tulevadki appi kasutajafunktsioonid - need, mis programmeerija ise kirjutab.Selles artiklis on juttu kahest asjast: -sellest, mis asjad on kasutajafunktsioonid ja kuidas neid kasutada -mis asjad on rekursiivsed funktsioonid ja kus ning kuidas neid kasutada Kasutajafunktsiooni kirjutamine Kasutajafunktsioon on niisiis funktsioon, mis ei ole PHP'sse sisse ehitatud, vaid mille programmeerija ise kirjutab. Lihtne näide võiks olla selline: PHP kood:
Seletame natuke: function arvuta($num1, $num2)function tähistab seda, et tegu on funktsiooniga. arvuta on selle funktsiooni nimi. Funktsiooni parameetriks määrasime $num1 ja $num2, mis tähendab seda, et seda funktsiooni välja kutsudes peavad olema kindlasti antud parameetrid $num1 ja $num2. Ülejäänud kraam funktsiooni sees on täiesti tavaline PHP kood, mis ei erine mingilgi määral "tavalisest" PHP koodist, mida sa mujal kasutad. Funktsiooni väljakutsumine on ka imelihtne ning ka see ei erine tavaliste PHP funktsioonide väljakutsumisest ning töötab täpselt samamoodi nagu iga teisegi funktsiooni korral: või Funktsiooni sees kasutatavad muutujad Oma näites andsime funktsioonile kaks kohustuslikku muutujat: $num1 ja $num2. Need nimed on kasutusel ainult funktsiooni sees, st funktsiooni väljakutsudes ei pea me kasutama samu nimesid, vaid võime seda teha ka nii: Neid funktsioonile edastavaid muutujaid nimetatakse tegelikult funktsiooni argumentideks. Kuid argumente saab funktsioonile anda ka teisiti, vaatame nüüd natuke alternatiivseid võimalusi ka. Praegu olid mõlemad argumendid kohustuslikud, kuid neid võib vabalt ka mittekohustuslikeks defineerida, nimelt: Näide 1 - sel juhul peab funktsioonile andma ainult ühe argumendi, teine on vabatahtlik: PHP kood:
Juhul, kui kutsume funktsiooni välja nii: Saab funktsioon oma käsutusse kaks muutujat: $num1=5 ja $num2=4 Kutsudes aga nii: Saab funktsioon oma käsutusse $num1=5 ja $num2=7. Ehk siis juhul, kui vabatahtlik argument puudub, asendatakse see vaikimisi määratud väärtusega, antud juhul siis 4. Veel mõned näited illustreerimaks funktsiooni defineerimist ning väljakutsumist(ruumi kokkuhoiu mõttes jätan funktsiooni "keha" pildilt välja). Kõik argumendid on vabatahtlikud, ning välja võib seda funktsiooni kutsuda mitmeti: Idee on selles, et kui me tahame defineerida esimest ja kolmandat argumenti, siis ei saa vahelt ära jätta teist. Kui aga soovime ainult esimest defineerida, siis järgmisi vabatahtlikke muutujaid vaja ei ole. Kui funktsioon tahab saada segamini nii vabatahtlikke kui ka kohustuslikke muutujaid, siis on mõttekas funktsioon defineerida nii, et kohustuslikud on eespool, vaata ise miks: PHP kood:
Aitab lobast. See peaks selge olema :) Funktsioonisisesed ja globaalsed muutujad Kui meie funktsioonil on parameetrid $num1 ja $num2, siis need on funktsioonisisesed parameetrid - st nad kehtivad ainult selle funktsiooni sees ning ainult konkreetse väljakutsumise ajal(järgmisel korral sama funktsiooni kasutades defineeritakse need muutujad uuesti). Näide: PHP kood:
See kood prindib meile:
See tuleneb sellest, et funktsioonisisesed muutujad on lokaalsed. Aga muudame natuke koodi ja teeme nad globaalseteks. PHP kood:
Nüüd saame tulemuseks:
Seda seetõttu, et me defineerime funktsiooni sees muutja $kala globaalseks ja saame kasutada väljaspool funktsiooni defineeritud muutujaid. NB! Kui me muudame funktsiooni sees globaalse muutuja väärtust, siis see muutub ka väljaspool funktsiooni. Nt: PHP kood:
Nüüd saame tulemuseks:
Simpel, huh? Muutujatele viitamine Üks võimalus globaalsete muutujate kasutamisest mööda hiilida, on muutujatele viidata. PHP kood:
Ja üllatus-üllatus, välja prinditud vastus on suurte tähtedega. Maagiline asi on '&' märk funktsiooni argumendi nime ees. Kui aga ei ole soovi iga kord muutujale viidata, vaid ainult valikuliselt, siis võib viitamise viia ka funktsiooni väljakutsumise poolele. PHP kood:
NB! Kui soovid funktsiooni sees kasutada/defineerida konstante, siis need on alati kättesaadavad, kuna konstandid, erinevalt muutujatest, on alati globaalsed ja kasutatavad igal pool. PHP kood:
Tulemuseks on oodatult:
Tagastatavad väärtused Kui seni on meie funktsioonikesed ainult midagi echo'nud, siis tegelikult võivad nad ka vabalt väärtusi tagastada. Programmeerija valikul kas siis numbreid, stringe, tõeväärtuseid(true, false). Teeme funktsiooni, mis vähendab talle antud stringi ühe tähe võrra ja tagastame stringi: PHP kood:
Seekord ei ütle funktsioon ise midagi, vaid tagastab väärtuse ning sellega võime teha, mida soovime, ülemises näites echo'sime selle, aga seda võib ka muudmoodi kasutada, nt muutuja väärtustamiseks: Täpselt nagu tavaliste PHP funktsioonide korralgi - mõni "ütleb" oma tulemuse kohe välja(nt print_r()), mõni seevastu tagastab selle(nt strlen()). Igaks juhuks üks näide ka tõeväärtusmuutujatega: PHP kood:
Ja selle tulemus on loomulikult: "Harakas ei ole lind!", kuna 'harakas' ei eksisteeri jadas $linnud. Selle funktsiooni tööpõhimõte on sarnane nt PHP funktsioonidele isset() või seesama in_array(), mis tagastavad samuti kas true või false. Rekursiivsed funktsioonid Rekursioon tähendab seda, et funktsioon kutsub iseennast välja. Kasuks tuleb see näiteks mõne rekursiivsust nõudva ülesande(menüü joonistamine, mõned arvutusülesanded jne) lahendamisel. Lihtne mis? OK, sain vihjest aru, näidet vaja. Võtame aluseks sellesama suhteliselt mõttetu funktsiooni jaanalinnust, ainult seekord kahandame seda sõna niikaua, kuni järel ainult üksainus täht: PHP kood:
Selle funktsiooni tulemus on:
Kas pole toredalt mõttetu? Aga siiski põhiline asi rekursiivsete funktsioonide juures on see, et nad peavad oma töö mingil hetkel ka ära lõpetama, muidu satuksid nad lõpmatusse tsüklisse. Selle saavutamiseks on meie "jaanalinnufunktsioonis" kasutusel selline lõik: Ehk funktsioon kutsub ennast välja ainult seni, kuni järelejäänud string on veel suurem kui 1 tähemärk. Praktikas võiks rekursiivset funktsiooni kasutada näiteks menüü joonistamisel: PHP kood:
Ülaltoodud näide eeldab umbes taolist SQLi tabelistruktuuri:
Funktsioonide nimed Omatehtud kasutajafunktsioonidele võid loomulikult panna sellised nimed, nagu ise soovid, aga paar tingimust siiski on: Kus ja miks funktsioone kasutada? Funktsioonid on esimene samm koodi korduvkasutuseks. Kui sul tuleb teha samas koodis mitu korda ühte ja sama asja, siis on selle jaoks juba mõttekas funktsioon kirjutada ning iga kord see toiming läbi funktsiooni teostada. Teine aspekt on loomulikult see, et sa saad samu funktsioone ju väga edukalt erinevates projektides kasutada: nt teed eraldi faili MySql funktsioonidega, kus on funktsioonid ühenduse loomiseks, päringu esitamiseks jm vajaliku jaoks. Nii säästad iga kord hulga aega, kui ei pea mysql päringu tegemiseks kogu kraami otsast peale kirjutama, vaid lisad lihtsalt funktsioonifaili: Samuti on funktsioonide tundmine eelduseks sisenemisele objektorienteerituse võrratusse maailma, aga sellest juba mõnes teises artiklis :) Artikli kommentaarid |
|