Objecter Introduktion Webintegrator HF1 PHP Object orienteret
Class I object orienteret programmering benytter vi os af begrebet klasser. En klasse beskriver hvad objektet indeholder. Vi har tidligere set på hvordan vi kunne gemme oplysninger om en person i et assosiativ array, her gør vi det samme blot vha en klasse i stedet. I beskrivelsen af klassen fortæller vi hvilke attributter klassen skal have, det svarer til de keys eller index vi kender fra arrayet. Derefter opretter vi $p som et object (en variabel) at typen Person, og sætter værdier ind. © Mercantec 2014 class Person { public $navn; public $gade; public $nr; public $ ; } $p = new Person(); $p->navn = "Peter"; $p->nr = 2; $p->gade = "Vestergade"; $p-> = print (" "); print_r($p); print(" ");
Attributter (Public og private) Attributter er de variable som klassen indeholder. Hvis vi vil beskytte vores attributter så de ikke kan ændres sker det ved at skrive private foran navnet. Se hvordan vi her har gjort private, og bemærk fejlen i browser vinduet. class Person { public $navn; public $gade; public $nr; private $ ; } $p = new Person(); $p->navn = "Peter"; $p->nr = 2; $p->gade = "Vestergade"; $p-> = print (" "); print_r($p); print(" "); © Mercantec 2014
Constructor For alligevel at kunne bruge $ laver vi en konstruktør. Det er den funktion som hedder Person($ ). Konstruktøren tager som parameter og gemmer. Bag efter kan vi hente og anvende $ med funktionen get (), men vi kan ikke få lov til at ændre den. class Person { public $navn; public $gade; public $nr; private $ ; //Constructor function Person($ ){ $this-> = $ ; } function get (){ return $this-> ; } } //Kald til constructor $p = new $p->navn = "Peter"; $p->nr = 2; $p->gade = "Vestergade"; print_r($p); © Mercantec 2014
Methods Attributterne på en klasse er de parametre som siger noget om objektet (navn, kundenr…), men en klasse kan også indeholde metoder (funtioner) der er noget klassen kan gøre. I eksemplet herunder har vi tilføjet metoden sayHello($n). class Person { public $navn; ….. //Constructor function Person($ ){ $this-> = $ ; } function get (){ return $this-> ; } function sayHello($n){ printf(" Hello %s my name is %s ",$n,$this->navn); } } //Kald til constructor $p = new $p->navn = "Peter"; $p->nr = 2; $p->gade = "Vestergade"; $p->sayHello("Kurt"); © Mercantec 2014
Inheritance Når vi har lavet en klasse kan vi senere lave specialiseringer af klassen. I det viste tilfælde er klassen Person udvidet med klassen Ansat som har attributten $mdLoen og klassen Kunde som har attributten $kundeNr. Begge klasser arver $navn og metoden sayHello fra klassen Person. class Ansat extends Person{ public $mdLoen; function calcAarsLoen(){ return $this->mdLoen * 12; } } class Kunde extends Person{ public $kundeNr; } $a = new $a->navn = "Peter"; $a->mdLoen = 25000; print $a->calcAarsLoen(); print $a->sayHello("Jens"); $k = new $k->navn = "Kurt"; $k->kundeNr = 123; print $k->sayHello($a->navn); © Mercantec 2014
Constructor overload For klassen Person var $ private, og skulle angives når vi kaldte klassens constructor. $p = new Hvis vi ønsker at klassen Ansat skal have $mdLoen Private så den ikke kan ændres, må vi blot tilføje en construktor til Ansat, som tager både $ og $mdLoen som parameter. $mdLoen gemmer construtoren selv, medens $ sendes vidre til constructoren for Person. class Ansat extends Person{ private $mdLoen; function Ansat($mail,$mdLoen){ $this->mdLoen = $mdLoen; $this->Person($mail); } function calcAarsLoen(){ return $this->mdLoen * 12; } } $a = new $a->navn = "Peter"; print ($a->calcAarsLoen()); $a->sayHello("Jens"); print ($a->get ()); © Mercantec 2014
Relationer mellem klasser Klasser kan godt tage en anden klasse som attribut. I viste eksempel har vi lavet klassen Bil der har atributten $ejer. Inden vi opretter en bil laver vi Personen $p, der efter følgende sættes som ejer af bilen $b. class Bil { public $ejer; private $regnr; function Bil($regnr,$ejer){ $this->regnr = $regnr; $this->ejer = $ejer; } function visdata(){ printf(" Bil med registreringsnr: %s ",$this->regnr); printf(" Ejes af: %s ",$this->ejer->navn); } } $p = new $p->navn = "Peter"; $b = new Bil("AA123456",$p); $b->visdata(); © Mercantec 2014
UML Med et UML klassediagram kan man illustrere sammenhæng imellem klasserne. Diagrammet herunder viser hvordan Ansat og Kunde arver fra Person, men også hvordan Bil har relationer til Person. © Mercantec 2014