Hallo,

Bij OOP doe je wel eens een object meegeven aan een ander object.
Bijvoorbeeld:

<?php
class A {
    private $_b;
    public function __construct(B $objVanB) {
        $this->_b = $objVanB;
    }
    public function doeIetsMetB() {
        $this->_b->doeIets();
    }
}
class B {
}
?>

Is dit goed gebruik van OOP?
Hierdoor worden klasses wel afhankelijk van elkaar, dus wil je klassen gaan hergebruiken, dan moet je de andere klassen mee nemen, omdat de ene klasse de andere nodig heeft.
Nee, je geeft geen interface mee. Je geeft aan dat een object een child moet zijn van dat interface.

Met het geen je voor een parameter zet geef je aan welk type class het moet zijn. Bijvoorbeeld:
<?php
class Database
{
public function __construct(PDO $db)
{
// ...
}
}

$pdo = new PDO(...);
$db = new Database($pdo); // werkt, het eerste argument is een instance of PDO

$mysqli = new MySQLi(...);
$db = new Database($mysqli); // error, het eerste argument is een instance of MySQLi, niet PDO
?>

Dit voorbeeld werkt met exacte klassen, je kan ook met child klassen en dus ook met interfaces type hinten:
<?php
class RouteLoader
{
public function __construct(CacherInterface $cacher)
{
// ...
}
}

interface CacherInterface
{
public function fetch($id);
public function save($id, $data);
}

class FileCacher implements CacherInterface
{
// ...
}

class DatabaseCacher implements CacherInterface
{
// ...
}

class VerkeerdeCacher //! let op, implementeert niet CacherInterface
{
// ...
}

$cacher = new FileCacher(...);
$loader = new RouteLoader($cacher); // werkt, 1e argument implementeert CacherInterface

$cacher = new DatabaseCacher(...);
$loader = new RouteLoader($cacher); // werkt ook, 1e argument implementeert weer CacherInterface

$cacher = new VerkeerdeCacher(...);
$loader = new RouteLoader($cacher); // werkt niet, 1e argument implementeert niet CacherInterface
?>
Wouter, Even terug naar die dependency injection. Is het nou zo dat je voor elke interface een andere service container hebt of heb je 1 service container voor je hele applicatie?

Ik heb DI nooit echt gebruikt moet ik zeggen maar is dit niet iets wat je in principe zou kunnen gebruiken ipv een singleton?
> Is het nou zo dat je voor elke interface een andere service container hebt of heb je 1 service container voor je hele applicatie?

1 voor heel je applicatie.

> Ik heb DI nooit echt gebruikt moet ik zeggen maar is dit niet iets wat je in principe zou kunnen gebruiken ipv een singleton?

Ja, behalve dat je singletons vanuit een object gebruikt en je bij een service container juist ervoor zorgt dat het object niet weet welke klasse hij krijgt. Maar wil je meer weten, maak even een nieuw topic :)

Reageren