Al geruime tijd houdt ik me (hobbymatig) bezig met programmeren. Omdat ik oorspronkelijk begonnen ben met het maken van websites en daarbij gebruik heb gemaakt van PHP doe ik nog steeds het meeste van deze taal, hoewel ik ook wel basale kennis heb van Java, c++ en c. (stel je er niet té veel van voor...) De PHP is OOP en de laatste tijd loop twijfel ik een beetje wat de goede aanpak is in volgende probleem:
Stel, we hebben drie klassen:
classA, classB, classC
Verder hebben we: objectA als instance van classA. objectA heeft als property obectB als instance van classB en objectC als instance van classC.
Of, anders gezegd.
Nu kan het voorkomen dat objectB iets tegen objectC wil zeggen. Andersgezegd, objectB wil een public method van objectC aanroepen. Nu is het de vraag hoe deze objecten toegang tot elkaar krijgen.
Hiervoor heb ik een aantal oplossingen gevonden:
- gebruik van globals
Als we $objectA tot een global maken en het property van de classA public, kunnen we overal toegang krijgen tot zowel $objectA en de methods daaruit alsook $objectB en $objectC. Met globals verlies je echter totaal het overzicht over je code. Voor mij valt deze optie dus af. Een voorbeeld:
- Instances doorgeven als argumenten
Bij deze optie worden de instances van classes bijvoorbeeld als argument aan de constructor gegeven. Op die manier heb je er controle over welke classen toegang hebben tot welke objecten. Nadeel is dat je (evenals bij globals) per class een stukje code nodig hebt om deze class toegang te geven tot tot bepaalde objecten. Voor de duidelijkheid een voorbeeld:
- Het gebruik van static classes
Bij deze laatste oplossing maak je in het geheel geen instance aan van $objectA. Het property van $objectA dat $objectB en $objectC bevat gaat in een static en dat is ook door het gehele script bereikbaar. Een voorbeeld:
Zelf ben ik de tweede optie wel eens in het werk van derden tegengekomen. Ik heb deze zelf ook vaak gebruikt. De laatste tijd heb ik echter meer de neiging om voor de derde te gaan. Ik heb ook op internet gezocht naar oplossingen die andere mensen voor dit probleem hebben gevonden en vaak wordt dan in forums iets soortgelijks aan het derde aangeraden.
Ik ben wel benieuwd wat de gedachte van GoT hierover is. Bestaan er argumenten waarom één van de opties (en dan voornamelijk uit de laatste twee) beter is? Zie ik een andere optie over het hoofd of heb ik het concept van OOP nog niet helemaal begrepen?
Stel, we hebben drie klassen:
classA, classB, classC
Verder hebben we: objectA als instance van classA. objectA heeft als property obectB als instance van classB en objectC als instance van classC.
Of, anders gezegd.
PHP:
1
2
3
4
5
6
7
8
9
10
11
| class classA{ public $objectB, $objectC; public function __construct(){ $this->objectB = new classA(); $this->objectC = new classB(); } } class classB{} class classC{} $objectA = new classA(); |
Nu kan het voorkomen dat objectB iets tegen objectC wil zeggen. Andersgezegd, objectB wil een public method van objectC aanroepen. Nu is het de vraag hoe deze objecten toegang tot elkaar krijgen.
Hiervoor heb ik een aantal oplossingen gevonden:
- gebruik van globals
Als we $objectA tot een global maken en het property van de classA public, kunnen we overal toegang krijgen tot zowel $objectA en de methods daaruit alsook $objectB en $objectC. Met globals verlies je echter totaal het overzicht over je code. Voor mij valt deze optie dus af. Een voorbeeld:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| class classA{ public $objectB, $objectC; public function __construct(){ $this->objectB = new classA(); $this->objectC = new classB(); } } class classB{ public function someMethod(){ //code } } class classC{ public function someOtherMethod(){ global $objectA; //code $objectA->objectB->someMethod(); } } global $objectA = new classA(); |
- Instances doorgeven als argumenten
Bij deze optie worden de instances van classes bijvoorbeeld als argument aan de constructor gegeven. Op die manier heb je er controle over welke classen toegang hebben tot welke objecten. Nadeel is dat je (evenals bij globals) per class een stukje code nodig hebt om deze class toegang te geven tot tot bepaalde objecten. Voor de duidelijkheid een voorbeeld:
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
| class classA{ public $objectB, $objectC; public function __construct(){ $this->objectB = new classA( $this ); $this->objectC = new classB( $this ); } } class classB{ public function someMethod(){ //code } } class classC{ private $objectA; public function __construct( $objectA ){ $this->objectA = $objectA; } public function someOtherMethod(){ //code $this->objectA->objectB->someMethod(); } } $objectA = new classA(); |
- Het gebruik van static classes
Bij deze laatste oplossing maak je in het geheel geen instance aan van $objectA. Het property van $objectA dat $objectB en $objectC bevat gaat in een static en dat is ook door het gehele script bereikbaar. Een voorbeeld:
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
| class classA{ public static $objectB, $objectC; public static function main(){ self::$objectB = new classA(); self::$objectC = new classB(); //code } } class classB{ public function someMethod(){ //code } } class classC{ private $objectA; public function __construct(){ //code } public function someOtherMethod(){ //code classA::$objectB->someMethod(); } } classA::main(); |
Zelf ben ik de tweede optie wel eens in het werk van derden tegengekomen. Ik heb deze zelf ook vaak gebruikt. De laatste tijd heb ik echter meer de neiging om voor de derde te gaan. Ik heb ook op internet gezocht naar oplossingen die andere mensen voor dit probleem hebben gevonden en vaak wordt dan in forums iets soortgelijks aan het derde aangeraden.
Ik ben wel benieuwd wat de gedachte van GoT hierover is. Bestaan er argumenten waarom één van de opties (en dan voornamelijk uit de laatste twee) beter is? Zie ik een andere optie over het hoofd of heb ik het concept van OOP nog niet helemaal begrepen?
offtopic:
p.s. Er zal hier en daar wel een foutje in de code zitten. Het is nogal lastig om in zo'n GoT berichtvenstertje code te typen zonder alle hulpmiddelen van een fatsoenlijke editor. De bedoeling is dat de ideeën die ik hier neer zet duidelijk zijn.
p.s. Er zal hier en daar wel een foutje in de code zitten. Het is nogal lastig om in zo'n GoT berichtvenstertje code te typen zonder alle hulpmiddelen van een fatsoenlijke editor. De bedoeling is dat de ideeën die ik hier neer zet duidelijk zijn.