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.
Arv
Arv betyr noe annet i den objekt-orienterte verden enn det gjør i virkeligheten; her er det ingen dødsfall involvert. Når vi snakker om arv i OOP, snakker vi i en mer evolusjonsbasert måte. En Hund-klasse kan gjerne arve fra klassen Dyr. En Rottweiler-klasse vil arve fra klassen Hund.
Dette gjør det mulig å lage enkle hierarkier, hvor man kan endre på små ting ved oppførselen. For eksempel ville jeg utvidet det forrige eksempelet på denne måten;
<?php
class Hund
{
// standardutstyr på en hund
protected $bein = 4;
protected $hale = TRUE;
// navnet er individuelt
protected $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/>";
}
}
class Rottweiler extends Hund
{
protected $hale = FALSE;
// overskriver funksjonen i Hund
public function lagLyd()
{
echo $this->navn." sier: Grr!<br/>";
}
public function logreMedHale()
{
echo $this->navn." prøver å logre med ".
"halen, men oppdager at rottweilere ".
"ikke har hale!<br/>";
}
}
$fido = new Rottweiler("Fido");
$fido->lagLyd();
$fido->logreMedHale();
?>
Det viktige i eksempelet ovenfor er nøkkelordet extends i definisjonen av Rottweiler. Det sier at vi arver alle egenskapene til Hund-objektet. Det er i PHP bare mulig å arve fra en foreldreklasse. Vi definerer så noen av tingene på nytt, slik som $hale, som vi setter til usann som standard på en Rottweiler. Vi definerer også metodene lagLyd() og logreMedHale() på nytt, fordi vi ønsker at disse skal ha forskjellig oppførsel når vi jobber med et Rottweiler-objekt.
En Rottweiler har altså alle de samme egenskapene og metodene som en Hund, men oppførselen kan være annerledes. Vi hadde ikke trengt å definere lagLyd()-metoden i Rottweiler-klassen, men vi kunne likevel brukt metoden uten å tenke på hvor den er definert. I så tilfelle ville den pekt tilbake på lagLyd()-metoden i Hund-klassen.
I dette tilfellet kaller vi Hund for grunnklassen (eng. "base class"), og Rottweiler for subklassen (eng. "subclass"). Hund blir også omtalt som foreldreklassen til Rottweiler, og vi sier at Rottweiler arver fra Hund.