In deze tutorial ga ik uitleggen wat dependency injection is en hoe je er gebruik van maakt.
We beginnen even met een voorbeeldje:
Zoals je ziet maken we hier gebruiken van een User class en ook van onze database class.
Maar wat als je nu een ander databasetype wilt gebruiken?
De meest logische stap is om dan de new Mysql te veranderen naar een andere db-class, maar dat is ook niet zo mooi aangezien je db dan hardcoded in je class staat.
Hier komt dan DI bij kijken.
Voorbeeldje:
Zoals je ziet is onze code nu wat flexibeler. Bij het aanmaken van een user instance kunnen we nu kiezen welke db-class we gebruiken.
Zoals je ziet kiezen we onze db-class in de construct, maar er zijn nog meerdere manieren.
Bijvoorbeeld met getters en setters, wat houd dat in? Kijk eens naar de code hieronder.
En dan een voorbeeldje in de praktijk:
Je kan je db dan ook weer ophalen met de getDb() method.
Maar het kan ook helemaal anders, het gebruik van een Container, een container?! Wat is dat?
Je kunt een Container klasse een beetje bekijken als één grote class vol met data.
Een goede implementatie van zon Container class is het opensource project Pimple die je gratis kunt downloaden op github en gebruiken in je php projecten.
Maar hoe werkt dat nu? Je zult het vast wel beter snappen met een voorbeeldje in de praktijk.
Voor het gebruik van Pimple heb je wel minstens PHP 5.3 nodig.
Bedankt voor het lezen en als je vragen hebt mag je die altijd stellen.
- Raoul
We beginnen even met een voorbeeldje:
[COLOR= #0000BB]<?php[/COLOR]
[URL="http://www.php.net/class"]class[/URL] User
[COLOR= #007700]{[/COLOR]
[URL="http://www.php.net/public"]public[/URL] [COLOR= #0000BB]$db[/COLOR][COLOR= #007700];[/COLOR]
[URL="http://www.php.net/public"]public[/URL] [COLOR= #007700]function[/COLOR] __construct[COLOR= #007700]()
{[/COLOR]
[COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]db [COLOR= #007700]= new[/COLOR] Mysql[COLOR= #007700];
}
}[/COLOR]
?> Zoals je ziet maken we hier gebruiken van een User class en ook van onze database class.
Maar wat als je nu een ander databasetype wilt gebruiken?
De meest logische stap is om dan de new Mysql te veranderen naar een andere db-class, maar dat is ook niet zo mooi aangezien je db dan hardcoded in je class staat.
Hier komt dan DI bij kijken.
Voorbeeldje:
[COLOR= #0000BB]<?php[/COLOR]
[URL="http://www.php.net/class"]class[/URL] User
[COLOR= #007700]{[/COLOR]
[URL="http://www.php.net/public"]public[/URL] [COLOR= #0000BB]$db[/COLOR][COLOR= #007700];[/COLOR]
[URL="http://www.php.net/public"]public[/URL] [COLOR= #007700]function[/COLOR] __construct[COLOR= #007700]([/COLOR][COLOR= #0000BB]$db[/COLOR][COLOR= #007700])
{[/COLOR]
[COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]db [COLOR= #007700]=[/COLOR] [COLOR= #0000BB]$db[/COLOR][COLOR= #007700];
}
}[/COLOR]
?> Zoals je ziet is onze code nu wat flexibeler. Bij het aanmaken van een user instance kunnen we nu kiezen welke db-class we gebruiken.
[COLOR= #0000BB]<?php
$raoul[/COLOR] [COLOR= #007700]= new[/COLOR] User[COLOR= #007700](new[/COLOR] Mysql[COLOR= #007700]);[/COLOR]
[COLOR= #0000BB]$lennard[/COLOR] [COLOR= #007700]= new[/COLOR] User[COLOR= #007700](new[/COLOR] Postgre[COLOR= #007700]);[/COLOR]
?> Zoals je ziet kiezen we onze db-class in de construct, maar er zijn nog meerdere manieren.
Bijvoorbeeld met getters en setters, wat houd dat in? Kijk eens naar de code hieronder.
[COLOR= #0000BB]<?php[/COLOR]
[URL="http://www.php.net/class"]class[/URL] User
[COLOR= #007700]{[/COLOR]
[URL="http://www.php.net/public"]public[/URL] [COLOR= #0000BB]$db[/COLOR][COLOR= #007700];[/COLOR]
[URL="http://www.php.net/public"]public[/URL] [COLOR= #007700]function[/COLOR] setDb[COLOR= #007700]([/COLOR][COLOR= #0000BB]$db[/COLOR][COLOR= #007700])
{[/COLOR]
[COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]db [COLOR= #007700]=[/COLOR] [COLOR= #0000BB]$db[/COLOR][COLOR= #007700];
}[/COLOR]
[URL="http://www.php.net/public"]public[/URL] [COLOR= #007700]function[/COLOR] getDb[COLOR= #007700]()
{[/COLOR]
[URL="http://www.php.net/return"]return[/URL] [COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]db[COLOR= #007700];
}
}[/COLOR]
?> En dan een voorbeeldje in de praktijk:
[COLOR= #0000BB]<?php
$user[/COLOR] [COLOR= #007700]= new[/COLOR] User[COLOR= #007700]();[/COLOR]
[COLOR= #0000BB]$user[/COLOR][COLOR= #007700]->[/COLOR]setDb[COLOR= #007700](new[/COLOR] Postgre[COLOR= #007700]);[/COLOR]
?> Je kan je db dan ook weer ophalen met de getDb() method.
Maar het kan ook helemaal anders, het gebruik van een Container, een container?! Wat is dat?
Je kunt een Container klasse een beetje bekijken als één grote class vol met data.
Een goede implementatie van zon Container class is het opensource project Pimple die je gratis kunt downloaden op github en gebruiken in je php projecten.
Maar hoe werkt dat nu? Je zult het vast wel beter snappen met een voorbeeldje in de praktijk.
[COLOR= #0000BB]<?php
$container[/COLOR] [COLOR= #007700]= new[/COLOR] Pimple[COLOR= #007700]();[/COLOR]
[COLOR= #0000BB]$container[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]database.class[/COLOR][COLOR= #007700]] =[/COLOR] [COLOR= #DD0000]Mysql[/COLOR][COLOR= #007700];[/COLOR] [COLOR= #FF8000]// naam van de class die we willen gebruiken.[/COLOR]
[COLOR= #0000BB]$container[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]database[/COLOR][COLOR= #007700]] = function ([/COLOR][COLOR= #0000BB]$c[/COLOR][COLOR= #007700]) {[/COLOR]
[URL="http://www.php.net/return"]return[/URL] [COLOR= #007700]new[/COLOR] [COLOR= #0000BB]$c[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]database.class[/COLOR][COLOR= #007700]];
};[/COLOR]
[COLOR= #0000BB]$database[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #0000BB]$container[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]database[/COLOR][COLOR= #007700]];[/COLOR] [COLOR= #FF8000]// en we hebben het mysql object![/COLOR]
[COLOR= #0000BB]$user[/COLOR] [COLOR= #007700]= new[/COLOR] User[COLOR= #007700]([/COLOR][COLOR= #0000BB]$database[/COLOR][COLOR= #007700]);[/COLOR]
?> Voor het gebruik van Pimple heb je wel minstens PHP 5.3 nodig.
Bedankt voor het lezen en als je vragen hebt mag je die altijd stellen.
- Raoul