PHP-koden i exemplena i detta kapitel svarar mot "PHP v. 5.2".
Ett mycket viktigt begrepp inom skriptspråket PHP och tillika för alla andra programmerings- och skriptsrpåk är funktionen (eng. function). En funktion är ett språkelement som i sin mest karakteristiska form tar ett eller flera startvärden (indata till funktionen), därefter bearbetar dessa data på något sätt och slutligen producerar någon form av resultat av bearbetningen (funktionsvärdet, eller utdata från funktionen). Exakt hur bearbetningen går till förskonas vi programmerare från att behöva veta, så på sätt och vis ter sig funktionen som en slags svart låda med en ingång för indata och en utgång för funktionsresultatet:

Ett enkelt kodexempel. I PHP finns en fördefinierad funktion som heter "sqrt" och som tar ett hel- eller decimaltal som indata och beräknar kvadratroten av talet som utdata. Själva funktionsvärdet kan vi sedan skriva ut till webbsidan med en vanlig print-sats:
Skrivsättet är lånat från matematikens sätt att skriva matematiska funktioner, nämligen först funktionens namn följt av en parentes som omger indata (matematikens variabler, men detta ord används inte i programmeringssammanhang).
Metaforen med funktionen som en slags maskin som konverterar indata till utdata är bara en av de många språkliga beskrivningar man kan ta till för att förstå funktioner. En annan nyttig metafor är den om uttrycket (eng. expression). I ett skript- eller programmeringsspråk kan språkkonstruktioner ses som s.k. uttryck som kan utvärderas och då visa sig ha ett värde, som man sedan kan sammanfoga med andra värden, skriva ut eller använda som indata till nya funktioner. Ta t.ex följande kodavsnitt, där varje rad är ett "uttryck" i denna bemärkelse:
Det första uttrycket är bara ett enkelt givet värde (eng. literal; ibland pratar man om konstanter, eng constants), i detta fall en sträng. Strängens värde är precis strängen själv, p.s.s som värdet för ett heltal är heltalet självt.
Nästa exempel är en variabel, en slags "namngiven behållare" för värden. Du tilldelar en variabel sitt värde med en tilldelningssats t.ex $pris=23.50, och efter detta kommer uttrycket $pris ha just värdet 23,50.
Det tredje exemplet är ett uttryck vars värde är resultatet av en aritmetisk beräkning som utgår från de två värdena 2 och 3, och där beräkningen åstadkoms av additionsoperatorn.
En annan sorts operator är de logiska jämförelseoperatorerna. I det fjärde uttrycket ovan jämförs två värden, värdet på variabeln $pris och det givna värdet 100, med jämförelseoperatorn störreän. Värdet för hela uttrycket är antingen sant om det första värdet är större än det andra, annars är uttryckets värde falskt. PHP kan följaktligen förutom strängar och hel- och decimaltal även hantera logiska värden.
Operatorer som de artitmetiska beräkningsoperatorerna eller de logiska jämförelseoperatorerna kan man se som en slags "funktioner", även om skrivsättet skiljer sig från egentliga funktioner. Uttrycksexempel fem ovan är däremot en riktig funktion, den tidigare nämnda kvadratrotsfunktionen. Sedd som uttryck har denna konstruktion ett värde lika med utdata eller funktionsvärde för funktionen. I exemplet ovan är funktionsuttryckets värde alltså 5.
Mitt sista exempel är ett mer komplicerat uttryck, sammansatt av alla de tidigare nämnda typerna av uttryck. Hela uttrycket har ett sanningsvärde, d.v.s sant eller falskt, beroende på om variabeln $pris tidigare har tilldelats ett värde, och om i så fall detta värde är större än hundra. Testet om variabeln har ett värde görs med en logisk funktion, d.v.s en funktion som har två möjliga utdata, sant eller falskt.
Det är väl en smaksak om du vill se funktioner som svarta lådor för datamanipulering eller som språkliga uttryck med värden. Du kanske har andra metaforer som hjälper dig hantera funktioner och andra språkliga konstruktioner.
I PHP brukar man kalla de indata som skickas till en funktion för funktionens argument (eng. argument; ibland pratar man även om funktioners parametrar, eng. parameters). Skrivsättet är, som nämndes ovan, att argument till funktionen skrivs inom parentes efter funktionsnamnet. Det finns funktioner som inte tar några argument alls, funktioner som tar precis ett argument och funktioner som tar flera argument. Om det finns flera argument ska de inom argumentparenteserna skiljas av kommatecken. Några exempel:
Funktionen time() har som utvärde aktuell tid (om än formulerad på ett mycket konstigt sätt, nämligen antalet sekunder som förflutit sen nyåret 1970). Den tar sina indata från datorns systemklocka, och behöver alltså inte några argument. Notera dock att argumentparenteserna måste skrivas ut även om funktionen inte har några argument. Funktionen count() beräknar antal element i den vektor som ges som funktionens enda argument. Den tredje funktionen tar ett decimaltal som indata, i kodexemplet värdet på variabeln $tal, och ger som utdata samma decimaltal avrundat till det antal decimaler som står som funktionens andra argument.
Det är viktigt att komma ihåg att en funktion mycket väl kan ta indata av en datatyp och ge ett resultat som är en annan datatyp:
Funktionerna strlen() och strtoupper() tar båda en sträng som indata, men den ena funktionen returnerar ett heltal (antal tecken i strängen) medan den andra returnerar en annan sträng (den ursprungliga strängen med alla bokstäver som versaler).
På samma sätt finns inget som hindrar att funktioner med flera argument kan ha olika datatyper för de olika argumenten. Den ovan nämnda funktionen round() har t.ex ett decimaltal och ett heltal som sina två argument, i den ordningsföljden.
Jag sa tidigare att den mest generella formen av funktioner i PHP tar indata och konverterar dem till utdata. Vi har redan sett ett undantag från detta schema, nämligen funktionen time() som inte behöver några indata men ändå kan producera utdata. Det finns inte helt oväntat funktioner som tvärtom bara tar indata men inte ger ifrån sig några utdata. I somliga programmeringsspråk använder man särskilt treminologi för sådana språkkonstruktioner: en procedur (eng. procedure) eller subrutin (eng subroutine) gör något utan att leverera något värde, medan funktioner gör något och presterar ett värde. I PHP görs dock ingen språklig skillnad mellan dessa två företeelser.
Den kanske mest kända PHP-funktionen utan utdata är väl phpinfo() som skriver ut en massa teknisk information om installationen av PHP på din serverdator. För att verkligen betona sitt totala oberoende tar phpinfo() inte heller några argument!
Alla de funktioner jag har tagit som exempel ovan är fördefinierade i PHP, d.v.s de finns omedelbart tillgängliga när du skriver dina webbsideskript. De kallas också för standardfunktioner. Det finns hundratals färdiga PHP-funktioner av varierande grad av fiffighet. Du kommer antagligen inte att behöva använda särskilt många av dem i dina webbsidor, men det kan aldrig skada att känna till vad PHP efbjuder, för förr eller senare uppstår en situation där även någon obskyr specialfunktion kan komma till användning.
Alla PHP:s fördefinierade funktioner finns mycket väl dokumenterade i online-manualen www.php.net/manual/en/funcref.php. Se även nästa avsnitt där jag beskriver några vanliga standardfunktioner i PHP.
Om du känner behov av funktioner som inte finns fördefinierade låter dig PHP 8och alla andra programmeringsspråk) att definiera egna funktioner. Definionen utgörs av en funktionsdeklaration som du lägger först i koden för den sida där funktionen kommer att användas. I deklaretionen ger du funktionen ett namn och bekriver hur många argument den ska ha. Sedan följer en detaljerad bekrivning av det funktionen ska göra med ev. indata och en angivelse av de utdata funktionen ska ha som värde. Detta görs med vanlig PHP-kod.
Nere i din valnliga PHP-kod i skriptet kan du sedan använda din funktion precis som om det vore en av PHP:s egna fördefinierade funktioner. Man brukar säga att en funktion anropas nere i koden. Det som "anropas" är funktionsdklarationen i början av sidan. Se avsnittet "Definiera egna funktioner" för en noggrannare beskrivning av hur du går till väga.
© 1995-2010 Hans Mühlen
Kontaktadress: hvzm physto.se
Kurserna ges av Fysikum vid Stockholms universitet.
Senast uppdaterad 9 oktober 2007