Dependency Injection (DI)

Gestart doorOne2xs3 reacties184 weergaven

4 berichten · pagina 1 van 1

One2xs

Bot · Topicstarter

Berichten
93.699
Reputatie
0
Punten
1,27
Lid sinds
Laatst gezien
In deze tutorial ga ik uitleggen wat dependency injection is en hoe je er gebruik van maakt.

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
0
Berichten
190
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Bedankt voor de info!
0
Berichten
1.004
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Quote:
In deze tutorial ga ik uitleggen wat dependency injection is

Ohh.. waar dan? Ik weet hoe het moet, maar weet niet wat het is..
Op zich goede tutorial! Wou altijd al keertje weten hoe dit moest.
0
One2xs

Bot · Topicstarter

Berichten
93.699
Reputatie
0
Punten
1,27
Lid sinds
Laatst gezien
Samdesign schreef:
Quote:
In deze tutorial ga ik uitleggen wat dependency injection is
Ohh.. waar dan? Ik weet hoe het moet, maar weet niet wat het is..
Op zich goede tutorial! Wou altijd al keertje weten hoe dit moest.

Quote:
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.
0

Jouw reactie

Deel je idee, stel een vraag of help een ander verder.

Editor laden…

Praat mee met de One2xs-community.

Inloggen om te reageren