Guide: PHP- & MySQL-innføring: Kapittel 7

Objekt-orientering

Etter en lengre juleferie skal vi dekke objekt-orientering, som er en metode for å sette data og oppførsel i sammenheng.

Klasser og objekter

Hva er så objekt-orientering? Når man programmerer jobber man i all hovedsak med to ting; data og oppførsel. Til nå har vi kalt dataene våre vært lagt i variabler, mens oppførselen finner vi i funksjoner, og de har dermed vært separate. Objekt-orientering lar deg gruppere data og oppførsel i klasser.

Klasser og objekter er de to hovedbegrepene man må innom når man snakker om objekt-orientert programmering. En klasse beskriver hvordan et objekt ser ut, hvilke funksjoner og variable det har. En klasse kan på den måten sammenlignes med konstruksjonstegningen over et hus; den beskriver hvordan man skal bygge huset og hva det skal inneholde, men konstruksjonstegningen er ikke selve huset. Du kan bygge flere hus (objekter) fra en tegning (klasse).

Objekt-orientering er på denne måten en enkel måte å definere hvordan data og oppførsel henger sammen. Tenk deg en klasse som heter Hund, som sier at objekter laget fra denne klassen har fire bein, en hale, et navn, og metodene lagLyd() og logreMedHale(). Klassen definerer da bare det grunnleggende om hvordan en hund oppfører seg, men er nettopp bare det, en abstrakt beskrivelse.

Vi kan definere vår abstrakte hund ved hjelp av PHP-nøkkelordet class. Her er hvordan undertegnede ser for seg en hund;


<?php
class Hund
{
    
// standardutstyr på en hund
    
private $bein 4;
    private 
$hale TRUE;
    
// navnet er individuelt
    
private $navn;
    
    
// lag en ny hund med et gitt navn
    
public function __construct($navn)
    {
        
$this->navn $navn;
    }
    
    
// lager en typisk hundelyd
    
public function lagLyd()
    {
        echo 
$this->navn." sier: Voff!<br/>";
    }
    
    
// lar hunden vår logre med halen
    
public function logreMedHale()
    {
        echo 
$this->navn." logrer med halen!<br/>";
    }
}
?>

Merk at om du kjører dette PHP-skriptet, vil du ikke få noe utdata i det hele tatt. Det er fordi dette bare er en definisjon, og vi oppretter på ingen tidspunkt et Hund-objekt, men vi sier bare noe om hvordan et Hund-objekt ville sett ut dersom vi hadde produsert en Hund.

class-nøkkelordet etterfølges av navnet på klassen vi definerer, og alt som er innenfor de påfølgende klammeparentesene er en del av klassedefinisjonen. Medlemsvariabler, slik som $bein, $hale og $navn i eksempelet, må skrives med et spesielt nøkkelord som angir synlighet foran. Her har alle medlemsvariablene synligheten private, noe vi skal komme nærmere inn på senere.

Funksjoner deklareres på samme måte som tidligere, bare med unntaket at du må ha private, protected eller public foran nøkkelordet function. En av funksjonene i eksempelet over er spesiell, __construct(). Denne kalles en konstruktor, og er den som blir kjørt når du instansierer (lager) et Hund-objekt. For å lage et Hund-objekt, må du gi hunden ditt et navn. $this->navn gir deg tilgang til hundens interne navn-variabel, mens $navn kun peker til parameteret til funksjonen __construct().

$this er en spesiell variabel som gir deg det objektet som du jobber på. Det er gjennom denne variabelen du får tilgang til funksjonalitet som finnes andre plasser i objektet (om det måtte være variabler eller funksjoner).

Lage objekter

Å opprette objekter når man har klassedefinisjonen er svært enkelt. Om du skriver følgende kode nederst i skriptet ovenfor, vil du få skrevet ut to linjer når du kjører det.



$fido = new Hund("Fido");
$fido->lagLyd();
$fido->logreMedHale();

Det er den første linjen som oppretter objektet, og du er nødt til å gi inn det antall parametre som konstruktoren krever. Nøkkelordet er new, og du må huske å tilordne objektet ditt en variabel.

De to neste linjene kaller funksjoner på objektet, først lagLyd() og deretter logreMedHale(). Legg merke til syntaksen som blir brukt her, $fido->lagLyd() sier at i objektet som $fido inneholder, kall metoden lagLyd(). Om du har en medlemsvariabel med synlighet public, kan du få tilgang til den med $fido->variabel, den eneste forskjellen er de manglende parentesene.