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.
Synlighet
I eksemplene til nå har vi sett flere nøkkelord som vi ikke har forklart, blant annet protected og public. I tillegg finnes et nøkkelord private som kan plasseres på samme plass. Disse nøkkelordene angir synligheten til en egenskap eller en metode. Du kan tenke på synlighet som en form for tilgangskontroll, dine foreldres hus og alle dets egenskaper er f.eks. (sannsynligvis) protected, som betyr at du (en subklasse av dine foreldre) har tilgang.
Den mest restriktive formen for synlighet er private. Private metoder og variabler kan bare benyttes av funksjoner som tilhører klassen, men ikke av subklasser. Her er et eksempel;
<?php
class Forelder
{
private $variabel = 2;
public function ForeldreMetode()
{
echo 'Variabel er '.$this->variabel.
" (fra Forelder::ForeldreMetode)\n";
}
}
class Barn extends Forelder
{
public function BarnMetode()
{
// dette feiler!
echo 'Variabel er '.$this->variabel.
" (fra Barn::BarnMetode)\n";
}
}
$forelder = new Forelder();
$barn = new Barn();
$forelder->ForeldreMetode(); // OK
$barn->ForeldreMetode(); // OK
$barn->BarnMetode(); // ingen advarsel, men feiler
// disse to linjene blir aldri kjørt,
// PHP gir feil
echo 'Variabel er '.$forelder->variabel.
' (på $forelder)'."\n";
echo 'Variabel er '.$barn->variabel.
' (på $barn)'."\n";
?>
De to første kallene, som kaller ForeldreMetode() vil være vellykkede, men BarnMetode() har ikke tilgang på $this->variabel fordi denne er private, og vil derfor bare skrive ut "Variabel er ". Når vi prøver å få tilgang til variabelen fra helt utenfor objektet, får vi en fatal feil fra PHP, og skriptet slutter å kjøre. Her er resultatet av å kjøre dette skriptet.
Variabel er 2 (fra Forelder::ForeldreMetode)
Variabel er (fra Barn::BarnMetode)
Fatal error: Cannot access private property Forelder::$variabel in /var/www/tests/php-guide/7/5.php on line 29
Om vi endrer $variabel til å være protected i eksempelet ovenfor, vil Barn få tilgang til $variabel, men den vil fremdeles være utilgjengelig fra utsiden av klassen. Med denne lille endringen får vi følgende utdata:
Variabel er 2 (fra Forelder::ForeldreMetode)
Variabel er 2 (fra Barn::BarnMetode)
Fatal error: Cannot access protected property Forelder::$variabel in /var/www/tests/php-guide/7/5.php on line 29
Som du kan se fikk vi nå tilgang til $variabel fra BarnMetode(), men vi kan likevel ikke hente verdien uten fra objektet. For å få til det må vi gjøre variabelen public, og om vi gjør endringen blir resultatet slik;
Variabel er 2 (fra Forelder::ForeldreMetode)
Variabel er 2 (fra Barn::BarnMetode)
Variabel er 2 (på $forelder)
Variabel er 2 (på $barn)