OOP (Public, Protected en Private)
1. Inleiding
2. Welke types zijn er?
3. Public
4. Protected
5. Private
6. Besluit
top
1. Inleiding
Vanaf PHP5 zijn er veel mogelijkheden bij gekomen, vooral op het gebied van OOP en foutafhandeling.
Bij OOP is er ook de mogelijkheid gekomen de leden te beschermen tegen overerving (private) en oproeping van buitenaf (protected).
Je kan nu dus bepalen welke variabelen er mogen gebruikt worden en welke niet.
Ik ga hier dus de 3 types bespreken en bij elk een voorbeeldje geven.
top
2. Welke types zijn er?
Eerst en vooral eens kijken welke types er zijn:
- public (publiek)
- protected (beschermd)
- private (privé)
top
3. Public
Public is het standaard type. Toch is het meegeven hiervan altijd ordelijk en duidelijker.
Je zal geen problemen ondervinden bij het aanroepen van deze variabele.
<?php
class Class1 {
public $publiek = "Publieke variabele<br />"; //een publieke string
public function hallo() {
echo "hallo!<br />";
}
}
class Class2 extends Class1 {
function hoi() {
Class1::hallo();
echo $this->publiek;
}
}
$obj = new Class1();
echo $obj->publiek;
$obj->hallo();
$obj2 = new Class2();
$obj2->hoi();
?>
|
Zoals je ziet zal de output zijn:
Publieke variabele
hallo!
hallo!
Publieke variabele
|
Alle public lidvariabelen en public lidfuncties zijn van buitenaf oproepbaar en worden mee overgeërft.
Als je je leden als public declareert heb je het voordeel onnodige errors te voorkomen en is je code soepel tegenover jou.
Het nadeel dan wel is dat er de mogelijkheid is om een lidfunctie/lidvariabele aan te roepen waar je van weet dat het eigenlijk niet mag.
top
4. Protected
Protected beschermt het lid gedeeltelijk.
Het is mogelijk het lid over te erven maar niet van buitenaf aan te roepen.
Je hebt dus wat minder speling als bij public, maar nog altijd veel vrijheid.
<?php
class Class1 {
protected $beschermd = "beschermd variabele<br />"; //een beschermd string
protected function hallo() {
echo "hallo!<br />";
}
}
class Class2 extends Class1 {
function hoi() {
Class1::hallo();
echo $this->beschermd;
}
}
$obj = new Class1();
//echo $obj->beschermd; ==> zal niet gaan
//stuurt volgende error terug:
//Fatal error: Cannot access protected property Class1::$beschermd ...
//$obj->hallo(); ==> zal niet gaan
//stuurt volgende error terug:
//Fatal error: Call to protected method Class1::hallo() from context '' in ...
$obj2 = new Class2();
$obj2->hoi();
?>
|
Zoals je ziet zal bij het aanroepen van een protected lid van buitenaf een Fatal error optreden.
Het aanroepen van een parentlid die protected is, is wel mogelijk.
top
5. Private
Private, de laatste van de 3.
Private schermt je lid eigenlijk volledig af.
Het zal in de meeste gevallen een fatal error geven en anders gewoon NULL terugsturen (wat gelijk is aan "" ==> niets).
Je kan het lid alleen in de classe zelf aanroepen, dus niet in een child class en zéker niet buiten de classes.
<?php
class Class1 {
private $prive = "prive variabele<br />"; //een prive string
private function hallo() {
echo "hallo!<br />";
}
public function test() {
$this->hallo();
echo $this->prive;
}
}
class Class2 extends Class1 {
function hoi() {
//Class1::hallo(); ==> zal niet gaan
//stuurt volgende error terug:
//Fatal error: Call to private method Class1::hallo() from context 'Class2' in ...
echo $this->prive; //==> zal niets laten zien
//de variabele is wel gedeclareerd maar er is geen toegang tot
}
}
$obj = new Class1();
$obj->test(); //zal wel gaan
//je roept een public functie aan. Deze roept binnen de class een private functie aan, wat wel mag!
//echo $obj->prive;// ==> zal niet gaan
//stuurt volgende error terug:
//Fatal error: Cannot access private property Class1::$prive in ...
//$obj->hallo();// ==> zal niet gaan
//stuurt volgende error terug:
//Fatal error: Call to private method Class1::hallo() from context '' in ...
$obj2 = new Class2();
$obj2->hoi();
?>
|
Zoals je ziet is bijna alles commentaar omdat het anders een fatal error geeft. Het is dus wel mogelijk het lid aan te roepen binnen de class.
Behalve de public functie omdat deze binnen de class de private leden aanroept, wat dus wél mag!
Dit is bv. handig als je bepaalde gegevens wilt verwerken binnen een class via een methode, en deze methode direct deze verwerkte gegevens doorstuurt naar een andere methode binnen de class.
Zo moet je die eerste methode niet aanroepen, maar wel de 2e.
Nu, stel je hebt je meeste leden private gemaakt omdat dit het veiligst is, en je wilt toch de waarde van een lid aanroepen van buitenaf.
Dan zou je het lid public kunnen maken, maar dat zal problemen met zich meebrengen.
Dan kan je wel een public methode maken die de WAARDE van het lid terugstuurt, en niet het lid zelf.
Zoiets ziet er zo uit:
<?php
class ClassTest {
private $prive = "prive variabele<br />"; //een prive string
public function getprive() { //get + lidnaam word standaard gebruikt, je kan hier natuurlijk alles zetten
return $this->prive; //stuurt de waarde van prive terug
}
}
$obj = new ClassTest();
echo $obj->getprive();
?>
|
Met de methode getBeschermd roep je dan de waarde aan.
Nu wil je misschien ook (misschien maar 1 keer) de waarde instellen.
Je zou dit via een constructor kunnen doen, of via een andere methode die de waarde in het lid zet.
Dit is misschien handig omdat je dan zekerder bent van je actie, je WEET dat je een private lid gaat veranderen.
Zoiets zou je op de volgende manier kunnen doen:
<?php
class ClassTest {
private $prive = "prive variabele<br />"; //een prive string
public function getprive() {
return $this->prive;
}
public function setprive( $tekst ) { //set + lidnaam word standaard gebruikt, je kan hier natuurlijk alles zetten
$this->prive = $tekst; //veranderd de waarde van 'prive'
}
}
$obj = new ClassTest();
echo $obj->getprive(); //prive variabele
$obj->setprive( "halo" );
echo $obj->getprive(); //halo
?>
|
Maar eigenlijk als je het maar 1x zou willen instellen is het veel beter om met een constructor te werken.
Deze heeft ook rechten om een 'private lid' te herschrijven.
top
6. Besluit
Zo zie je maar. Waneer komt wat het beste uit.
Je moet voor jezelf bepalen of je deze stijl gebruikt. Het is niet verplicht, maar geeft wel meer functionaliteit aan je applicatie.
top
|