OOP correct gedaan?
heb iets kleins gescript in oop, maar is dit scriptje correct?
1) als je $tekst met getters en setters wilt aanspreken, maak hem dan zeker niet public. Neem hiervoor desgewenst private of protected (keuze hangt af als je wilt classes extenden)
2) waarom 'echo' voor je methode namen? Kan je beter gewoon weglaten.
3) je Toon() functie doet een echo. Beter is om daar return $this->tekst; te doen.
De rest is in orde gedaan.
Wat maakt het verschil als ik geen public gebruik?
EDIT: Ik snap het al, dus de variablen moeten PRIVATE of PROTECTED zijn,
maar moeten de functions dat ook?
Gewijzigd op 12/08/2010 10:22:22 door - Raoul -
Raoul Blabla op 12/08/2010 10:07:58:
Dankje, maar wat bedoel je moet classes extenden?
Wat maakt het verschil als ik geen public gebruik?
Wat maakt het verschil als ik geen public gebruik?
Dan kan de waarde buiten het object niet veranderd worden. Klein voorbeeldje:
Code (php)
Ofterwijl je zorgt ervoor dat je variablen niet buiten de klasse aangepast kunnen worden.
protected zegt alleen dat als je je class extend, de child de waarde wel kan veranderen zonder setters en getters (dat je dan net zoals voorbeeld A kan doen binnen de child, maar niet daarbuiten)
Hopelijk helpt dat.
Edit:
Edit: functies zijn bijna altijd public, maar daarvoor geldt hetzelfde verhaal. Wil je dat een functie alleen binnen het object zelf gebruikt kan worden, kies je private/protected (ligt eraan of je gaat extenden), en in alle andere gevallen kies je public.
Edit: functies zijn bijna altijd public, maar daarvoor geldt hetzelfde verhaal. Wil je dat een functie alleen binnen het object zelf gebruikt kan worden, kies je private/protected (ligt eraan of je gaat extenden), en in alle andere gevallen kies je public.
Gewijzigd op 12/08/2010 10:27:46 door SilverWolf NL
Dus je kan die B niet veranderen door b="test"; te doen dan ben je eigenlijk verplicht om de setB(); te gebruiken?
En heb mijn script wat verbeterd:
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
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
Gewijzigd op 12/08/2010 10:31:11 door - Raoul -
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
class A {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function setTheName($newName) {
$this->name = $name;
}
public function returnTheName() {
return $this->name;
}
}
$a = new A('DeNaam');
echo $a->returnTheName(); // DeNaam
$a->setTheName('AndereNaam');
echo $a->returnTheName(); // AndereNaam
// etc...
?>
class A {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function setTheName($newName) {
$this->name = $name;
}
public function returnTheName() {
return $this->name;
}
}
$a = new A('DeNaam');
echo $a->returnTheName(); // DeNaam
$a->setTheName('AndereNaam');
echo $a->returnTheName(); // AndereNaam
// etc...
?>
Kijk ook eens naar deze OOP Beginnershandleiding :-)
Even kort het idee achter private/protected/public: je schermt nu $name af van de buitenwereld, zodat alleen methods (functies) binnen je class deze kunnen lezen en schrijven. Waarom? Zodat je class de controle en de eindverantwoordelijkheid over $name houdt.
Stel dat $name aan een aantal eisen moet voldoen: Hij moet tussen de 3 en 20 tekens zijn, en het moet een string zijn. In je eerste voorbeeld was $name nog public. In je code zou je $x->name = array() kunnen doen, waardoor $name plots een array werd. Nu doet showTheName wel hele onverwachte dingen. Je verwacht een string van 3 en 20 tekens (immers, dat zijn de eisen van een geldige naam) maar krijgt een lege array!? Door setName() te voorzien van checks en $name private te maken, weet je zeker dat alleen setName gebruikt kan worden om $name een waarde te geven, en daarmee weet je zeker dat alleen dat wat door de checks van setName() komt ook als resultaat van showTheName() kan krijgen.
Nu is een naam een beetje te simpel voorbeeld. Maar stel dat je in je class een variabele hebt met arrays in arrays en dit een of andere complexe structuur oplevert. Door setters en getters te gebruiken weet je zeker dat zolang je class klopt, hij werkt omdat de structuur niet in de war geschopt wordt. Zou je zelf direct bij die structuur kunnen komen, dan is de kans vrij groot dat je een keer ergens een minder sterke controle op de correctheid van die structuur hebt staan, de structuur beschadigd, en je class niet meer werkt. En vind dan maar eens de oorzaak.
Daarnaast moet je dan de controle voor die structuur overal en nergens gaan toepassen. En dan kom je bij een tweede voordeel van classes: je hebt je code mooi compact bij elkaar. De controle van $name zit alleen in setName, en hoef je niet overal te hebben waar je met $name zit te frutselen.
Nog even als aanvulling op Blanche's voorbeeld: ik zou in de constructor niet $name direct toewijzen, maar $this->setTheName($name) aanroepen. Waarom? Nou, dat staat hierboven :) Omdat dan in setTheName alle controle voor een geldige naam kan zitten, en je het jezelf vrijwel onmogelijk maakt een niet-geldige naam toe te wijzen.
Geen 2 functies maken die hetzelfde doen he, alleen maar lastig als je die functionaliteit ooit s gaat veranderen.
Kan je beter dit doen,
Code (php)
Gewijzigd op 12/08/2010 10:55:58 door Johan Dam
True, sluit me helemaal aan bij bovenstaande twee reacties :-)
Dankje, heb wat bijgeleerd vandaag :P