PHP functions, arguments og hvordan lage egne funksjoner i PHP

Her vil du lære om PHP functions. Du vil lære de viktigste prinsippene som gjelder for funksjoner, og det er sterkt anbefalt at du følger svært nøye med på videoen og leser gjennom alt som står i denne guiden for å få fullt utbytte.

PHP tutorialen omhandler

  • Predefined functions
  • Arguments
  • Custom functions
  • Functions refrence / pointer
  • return fra functions
  • Funksjoner med default arguments
  • Funksjoner med x antall argumenter

Med andre ord et meget omfattende kapittel. Hold tunga rett i munnen og tren mye på å få funksjoner i fingrene. Vil bemerke at bruk av engelsk terminologi i disse tutorialene gjøres i beste mening. De beste programmeringsmanualene og ressursene står på engelsk. Veien din videre etter dette kurset vil sannsynligvis være på engelske ressurser.

Videotutorial om functions i PHP

Du har ikke installert Flash på datamaskinen din. Du trenger minimum flash 8 for å kunne se denne videoen.

Har du sett hele PHP-guiden? Da er tiden inne for å lese gjennom noen eksempler og digresjoner for å lære mer om funksjonene.

Predefined functions i PHP

Forhåndsdefinerte funksjoner i PHP betyr at funksjonene allerede er tilgjengelig for deg. Typiske eksempler på forhåndsdefinerte funksjoner er:

  • strlen()
  • strpos()
  • count()

I PHP er det flere tusen forhåndsdefinerte funksjoner, og ingen programmerere kan alle utenat. Derfor er det ofte nødvendig å se i PHP manualen etter ønsket funksjonalitet når man scripter.

Arguments i funksjoner

Funksjoner trenger ikke nødvendigvis å ta argumenter, men det er veldig vanlig at de gjør det. Slik er syntax for å angi argumenter

<?php
// Ett argument
strlen($argument);

// Flere argumenter angis med komma mellom hvert argument
isset($arg, $arg2, $arg3);
?>

Argumentene kan være arrays, objects (OOP), variabler og datatyper integer, string, boolean og float. Referer alltid til PHP manualen for å se hva slags argumenter en forhåndsdefinert funksjon tar, dersom du er usikker.

Custom functions i PHP

Ofte ønsker man å lage funksjoner som utfører oppgaver som bygger på én eller flere forhåndsdefinerte funksjoner, og som utfører ting på bakgrunn av logikk via if, elseif og else statements, loops og så videre.

Når man skal definere en funksjon, så bruker man constructen function før navnet på funksjonen, slik

<?php
function my_function() {
  print
'Hello World';
}
?>

Her har man definert en funksjon my_function som ikke tar argumenter, men printer ut en string til skjermen. Funksjonen er kun definert, for å bruke funksjonen må man calle den, dvs bruke den. På engelsk kalles dette to call a function.

Som med forhåndsdefinerte funksjoner skjer dette ved at man angir navnet på funksjonen og setter inn eventuelle argumenter den måtte ta.

<?php
// Definerer funksjonen
function say_something($var) {
  print
$var;
}

// Caller funksjonen
say_something('Velkommen til Hjemmeside!');

# Output: Velkommen til Hjemmeside
?>

Variabler og funksjoner

Noen ganger ønsker vi at funksjonen skal endre på en variabel. Da kan man bruke en pointer (refrence) når man definerer argumentene funksjonen tar. For å illustrere dette, begynner vi med å forklare hvordan variabler fungerer i og utenfor funksjoner.

Variabler i og utenfor funksjoner

I koden nedenfor definerer vi en variabel utenfor funksjonen, deretter caller vi variabelen fra funksjonen. Likeledes defineres en variabel i funksjonen og calles utenfra. Bruker du denne koden, vil den ikke printe ut noen av de to variabelen.

<?php
// Definerer en variabel
$variabel_utenfor = 'Hei, jeg er utenfor funksjonen';

// Definerer en funksjon
function say_something() {
   
// Definerer en variabel i funksjonen
   
$variabel_innenfor = 'Hei, jeg er inne i funksjonen';
   
   
// Prøver å printe ut variabelen som ble definert
    // utenfor funksjonen. Dette fungerer IKKE!
   
print $variabel_utenfor;
}

// Prøver å printe ut verdien av variabelen vi definerte
// inne i funksjonen. Dette vil IKKE virke.
print $variabel_innenfor;
?>

Skulle koden ovenfor printet ut de to variabelene, måtte man brukt global (som er en construct). Det global gjør, er å si at variabelen eksisterer både i og utenfor funksjonen. Det er sjelden smart å bruke global. La heller funksjonen ta de variabelene du trenger fra innsiden som argument(er), og returner variabler og annet fra funksjonen ved hjelp av return.

Skulle du likevel ønske å bruke global, så er dette måten å gjøre det på

<?php
function valider_bruker($gruppe) {
  global
$bruker // Variabel definert utenfor funksjonen
 
if ( $gruppe == 'admin' && $bruker['gruppe'] == 'admin' ) {
    return
'Du er administrator';
  } else {
    return
'Du er ikke administrator';
  } 
}
?>

Funksjoner og bruk av return

Det er ikke bestandig vi ønsker at funksjonen vår skal printe ut noe. Det hender også vi vil at den skal endre variabelen vi putter inn, og sammen med andre argumenter gjøre det vi ønsker. Dette gjør man ofte ved å bruke return (som er en construct). La oss lage en slink funksjon.

<?php
// Definerer funksjonen
function add_paragraph($string) {
    return
'<p>' . $string . '</p>';
}

// Definerer en variabel (string)
$var = 'Dette er et avsnitt';

// Modifiserer stringen med funksjonen
$var_paragraph = add_paragraph($var);


print
$var_paragraph;        // Printer ut variabelen med <p>-tagger
print add_paragraph($var);   // Printer ut variabelen med <p>-tagger
?>

Her ser vi altså at man først definerer funksjonen. Denne funksjonen tar variabelen som puttes inn og returnerer den med <p>-tagger. Ser du at funksjonen må calles for hver string den skal sende tilbake med markup?

Endre argumenter som sendes til funksjoner

På engelsk kalles det å angi et argument to pass a variable to a function eller passing an argument to a function. Når vi sender argumenter til funksjoner, og formålet er å endre innholdet av en variabel uten å bruke return, kan vi gjøre dette ved å bruke en refrence pointer, slik

<?php
// Legg merke til & (refrence pointer) foran variabelen
function modifiser_variabel(&$var) {
 
$var = $var . ' ... denne er endret';
}

$string = 'Hei';
modifiser_variabel($string);
print
$string; // Output: Hei ... denne er endret
?>

Her har man i tillegg muligheten til å bruke return true; hvis endringen finner sted, og return false; hvis den ikke gjør det.

Funksjoner med ubestemt antall argumenter

Kanskje man skulle latt funksjonen ta flere argumenter, og utført samme prosess på hvert argument? Hvis man ønsker å la en funksjon ta x antall argumenter, så må man ta i bruk noen forhåndsdefinerte funksjoner.

I dette eksempelet bruker vi kun én av dem, nemlig func_get_args(). Denne funksjonen finner alle argumentene og returnerer en array.

Man kunne også brukt func_get_arg() og func_num_args() i kombinasjon med en loop for å få alle argumentene, men her er førstnevnte best, da den i essensen bygger på de to funksjonene.

<?php
// Definerer funksjonen add_paragraphs()
function add_paragraphs() {
 
// Vi definerer en tom variabel
 
$output = '';
 
 
// "Spesialfunksjon" som henter alle
  // argumenter og returnerer dem i en
  // array (med index keys)
 
$args = func_get_args();
 
 
// Vi looper gjennom argumentene
 
foreach ( $args AS $p ) {
   
// Ser at argumentet er en string
   
if ( is_string($p) ) {
     
/*  
           Her fyller vi den tomme variabelen.
           Ved å bruke ".=" slettes ikke verdien som ble lagt inn forrige gang loopen kjørte.
           "\n" gir linjeskift
      */
     
$output .= '<p>' . $p . '</p>' . "\n";
    }
  }
 
// Ser til at $output ikke er tom
 
if ( !empty($output) ) {
    return
$output;
  } else {
    return
false;
  }
}
?>

Funksjonen ovenfor tar et uendelig antall argumenter. Disse argumentene må være strings. Videre hentes argumentene inn i en array, så looper man gjennom arrayen for å finne verdier av datatype string.

På bakgrunn av tekststrings i arrayen, bygger loopen $output (som også er en string). Denne sjekkes i sin tur for innhold, før den returneres fra funksjonen. Hvis den ikke inneholder noe, vil funksjonen returnere false.

Funksjoner med forhåndsdefinerte argumenter

Ofte ønsker vi å angi forhåndsdefinerte argumenter. Hvis man caller en funksjon som er definert med spesifiserte argumenter, vil disse være default. Det vil si at de brukes, dersom ikke argumentene sendes funksjonen når den calles.

<?php
// Funksjon med forhåndsdefinerte argumenter
function set_status(&$user, $status = 'offline') {
 
// Ser om brukestatus ikke er lik status
 
if ( $user['status'] != $status ) {
   
// Oppdaterer status og returnerer true
   
$user['status'] = $status;
    return
true;
  } else {
   
// Endrer ikke status og returnerer false
   
return false;
  }
}
?>

Om denne funksjonen calles uten at $status blir definert, vil funksjonen anta at verdien av $status er offline.