private, public, global...
Public -> Is beschikbaar ook voor buitenaf, is in elke class aan te roepen (bij een extend class ook gewoon net als een protected variabele)
Private -> Is alleen in de eigen class aan te roepen, niet in classes die de class waarin deze variabele is gedefinieerd extenden.
Protected -> is in de eigen class (waar die gedefinieerd wordt) aan te roepen en in alle classes die deze class extenden.
Goed, nu kan het zijn dat je "gebruik maakt van een class" door deze te extenden met een andere class. Echter de class die je extend gebruikt Intern een aantal variabelen, maar retourneerd slechts 1 variabele aan je terug. (dat laatste is vaak de bedoeling, al dan niet in de vorm van 1 array met waarden)
Je gaat dan niet de variabelen waar de extend class niets mee te maken heeft protected maken, maar die hou je private.
Als je het verschil niet goed weet of niet precies weet óf je de variabele ook buiten de class (in een extend class) moet kunnen aanroepen gebruik je protected, zo weet je wel zeker dat je daar geen problemen mee tegen komt. Echter om "altijd protected" te gebruiken (of public of course) is niet handig. Je kan zo onbewust ook variabelen van buiten een class aanpassen / lekken veroorzaken die er met een private variabele niet waren geweest. (doordat je in een andere/ extend class die waarde dan wel kan aanpassen terwijl dat eigenlijk niet mag/ zou moeten kunnen bijv)
Mijn tip in deze is dan ook: Zorg dat je goed het verschil weet tussen deze 3 mogelijke opties en gebruik deze ook op de manier (waar mogelijk) waarvoor ze bedoeld zijn. Private is niet evil.
Een voorbeeld zou je zelf (met ál jouw programmeerkennis) ook wel moeten kunnen bedenken aan de hand van het bovenstaande.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
class Person {
private $id;
// NIET VOOR KINDKLASSE BEREIKBAAR.
private $biologische_vader;
private $biologische_moeder;
public function __construct($id)
{
$this->id = intval($id);
$this->biologische_vader = "Haal ergens de vader-id";
$this->biologische_moeder = "Haal ergens de moeder-id";
}
// Alleen de eigen klasse en het kind-klasse mogen deze gebruiken.
protected function getBioVader()
{
return $this->biologische_vader;
}
// Deze mag iedereen gebruiken.
public function getBioMoeder()
{
return $this->biologische_moeder;
}
}
// Breidt Person uit.
class Lid extends Person {
private $id;
public function __construct($id)
{
// Contruct do ouder
parent::__contruct($id);
$this->id = intval($id);
}
public function getBioVader()
{
return parent::getBioVader();
}
// Haal het moeder-id (private) van parent
// public function getBioMoeder(), maar deze is al in de ouder public en hoeft dus niet nogmaals gedeclareerd te worden.
}
?>
class Person {
private $id;
// NIET VOOR KINDKLASSE BEREIKBAAR.
private $biologische_vader;
private $biologische_moeder;
public function __construct($id)
{
$this->id = intval($id);
$this->biologische_vader = "Haal ergens de vader-id";
$this->biologische_moeder = "Haal ergens de moeder-id";
}
// Alleen de eigen klasse en het kind-klasse mogen deze gebruiken.
protected function getBioVader()
{
return $this->biologische_vader;
}
// Deze mag iedereen gebruiken.
public function getBioMoeder()
{
return $this->biologische_moeder;
}
}
// Breidt Person uit.
class Lid extends Person {
private $id;
public function __construct($id)
{
// Contruct do ouder
parent::__contruct($id);
$this->id = intval($id);
}
public function getBioVader()
{
return parent::getBioVader();
}
// Haal het moeder-id (private) van parent
// public function getBioMoeder(), maar deze is al in de ouder public en hoeft dus niet nogmaals gedeclareerd te worden.
}
?>
Je kan niet je biologische ouders aanpassen!
Robert_Deiman schreef op 28.01.2010 11:06:
Sorry RichardvV, maar ik moet me wel aansluiten bij Jim in dit geval. Ik zal dit dan ook onderbouwen door een korte uitleg te geven.
....
Als je het verschil niet goed weet of niet precies weet óf je de variabele ook buiten de class (in een extend class) moet kunnen aanroepen gebruik je protected, zo weet je wel zeker dat je daar geen problemen mee tegen komt. Echter om "altijd protected" te gebruiken (of public of course) is niet handig. Je kan zo onbewust ook variabelen van buiten een class aanpassen / lekken veroorzaken die er met een private variabele niet waren geweest. (doordat je in een andere/ extend class die waarde dan wel kan aanpassen terwijl dat eigenlijk niet mag/ zou moeten kunnen bijv)
Mijn tip in deze is dan ook: Zorg dat je goed het verschil weet tussen deze 3 mogelijke opties en gebruik deze ook op de manier (waar mogelijk) waarvoor ze bedoeld zijn. Private is niet evil.
...
....
Als je het verschil niet goed weet of niet precies weet óf je de variabele ook buiten de class (in een extend class) moet kunnen aanroepen gebruik je protected, zo weet je wel zeker dat je daar geen problemen mee tegen komt. Echter om "altijd protected" te gebruiken (of public of course) is niet handig. Je kan zo onbewust ook variabelen van buiten een class aanpassen / lekken veroorzaken die er met een private variabele niet waren geweest. (doordat je in een andere/ extend class die waarde dan wel kan aanpassen terwijl dat eigenlijk niet mag/ zou moeten kunnen bijv)
Mijn tip in deze is dan ook: Zorg dat je goed het verschil weet tussen deze 3 mogelijke opties en gebruik deze ook op de manier (waar mogelijk) waarvoor ze bedoeld zijn. Private is niet evil.
...
Mooie uitleg!
"Zorg dat je goed het verschil weet tussen deze 3 mogelijke opties en gebruik deze ook op de manier (waar mogelijk) waarvoor ze bedoeld zijn."
Vooral gebruik ze waar ze voor bedoeld zijn!!!
Je mag ook (is zelfs gewenst) je posts ook aanpassen om dan die quote + reactie daarin te zetten hoor, is wel zo netjes. Ow, en dank voor het compliment over de uitleg. Veel duidelijker kon ik het niet maken.
@RichardvV
Maar je wilt niet al die variabelen kunnen aanroepen/ opvragen uit je childs, omdat een aantal zaken in de parent gebeuren die vast staan. Daar wil je niet van buitenaf invloed op hebben door dit zelf alsnog aan te roepen bijvoorbeeld.
Ikzelf heb dit gebruikt met een xml class (verzameling van meerdere classes) die vanuit gegevens die uit een database komen een xml genereerd. Er is een "master class" die puur functies heeft voor het genereren van de xml (voeg item toe, voeg waarde toe etc.) en die uiteindelijk de xml teruggeeft. Je geeft wel input, maar ik wil geen beschikking hebben over de variabelen (domelements in dit geval) die binnen de master class worden gebruikt. Ik krijg keurig een return value terug in dit geval, omdat ik dar iets mee wil doen.
Maar ook het aanpassen vanuit mijn child class van die domelements is niet wenselijk, dus daarom is het een private variabele, geen public of protected. Het is iets voor de parent class zelf, en de child heeft geen boodschap aan wat er intern gebeurt/ welke variabelen gebruikt worden in de parent class. Die verwacht alleen maar een xml string terug en die krijgt die ook.
moet ik alle vars die ik in een class gebruik defineren bovenin de class?
en moet dit dan boven de constructor?
btw, kan ik ook een constructor maken, zonder waarde? dat ik gewoon bepaalde handelingen wil uitvoeren bij het aanmaken van de class, en dus doe:
wesley schreef op 28.01.2010 12:08:
Kan iemand mijn vraag nog beantwoorden :(?
moet ik alle vars die ik in een class gebruik defineren bovenin de class?
// Ja, maar het kan zijn dat je binnen een methode variabelen gebruikt om bijvoorbeeld een loop te maken. Die moet je daar niet plaatsen.
De variabelen die je 'boven de constructor' plaatst noem je properties of eigenschappen.
en moet dit dan boven de constructor?
// Boven de constructor moet niet, ja mag zo ook verspreiden, maar dan wordt het snel een speurwerk naar viraibelen en loop je het risico dat je een var dubbel wilt gaan declareren.
btw, kan ik ook een constructor maken, zonder waarde? dat ik gewoon bepaalde handelingen wil uitvoeren bij het aanmaken van de class, en dus doe:
// Ja dat kan, en dat is afhankelijk van het soort object dat je er van wilt maken.
moet ik alle vars die ik in een class gebruik defineren bovenin de class?
// Ja, maar het kan zijn dat je binnen een methode variabelen gebruikt om bijvoorbeeld een loop te maken. Die moet je daar niet plaatsen.
De variabelen die je 'boven de constructor' plaatst noem je properties of eigenschappen.
en moet dit dan boven de constructor?
// Boven de constructor moet niet, ja mag zo ook verspreiden, maar dan wordt het snel een speurwerk naar viraibelen en loop je het risico dat je een var dubbel wilt gaan declareren.
btw, kan ik ook een constructor maken, zonder waarde? dat ik gewoon bepaalde handelingen wil uitvoeren bij het aanmaken van de class, en dus doe:
// Ja dat kan, en dat is afhankelijk van het soort object dat je er van wilt maken.
ik gebruik bijvoorbeeld vaak:
Code (php)
Hier haal ik bijvoorbeeld bij het aanmaken van mijn klasse al wat nodige gegevens op uit de database.
Daarnaast heeft het definieren van variable boven in de klasse te maken met de 'scope' van de variable.
Als jij je variable definieerd boven in de klasse word hij in de scope van de klasse gezet op de Heap.
Dit betekent dat ik deze variable kan benaderen via $object->variable;
op het moment dat je dat niet doet en dus je variable definieerd in de functie word die op de stack gegooit en kun je henm gebruiken in deze functie.
op het moment dat jij uit die functie gaat verdwijnt ook deze variable van de stack en is deze niet oproepbaar in je script op andere plaatsen. (zoals standaard functies).
ps. Fouten in benamingen voorbehouden.
Gewijzigd op 01/01/1970 01:00:00 door Thijs Damen
EDIT:
weer een vraag.
als ik ergens in mijn class dit heb staan:
protected function checkSaveData($deck, $us=false)
moet ik dan ook boven de constructor zetten:
protected function checkSaveData($deck, $us=false);
?
Gewijzigd op 01/01/1970 01:00:00 door wesley Overdijk
protected function checkSaveData($deck, $us=false);..
is een functie en geen variable/property.
Ah. Merci...
functions (methods) hoef je niet bovenaan in de class te definiëren.
De variabelen die je definieert bij een class zijn alleen de variabelen die je binnen verschillende functies binnen die class moet kunnen bereiken zonder ze eerst in die functie aan te moeten maken, of variabelen die je mee kan geven.
De variabelen die je in je aanroep van de constructor zet worden eigenlijk altijd wel gedefinieerd binnen je class.