<?php
 
 
class ExampleA
 
{
 
    public $variable;
 
}
 
 
class ExampleB
 
{
 
    public $exampleA;
 
 
    public $uniqueId;
 
 
    public function __construct(ExampleA $exampleA)
 
    {
 
        $this->exampleA = $exampleA;
 
 
        $this->exampleA->variable = uniqid();
 
    }
 
}
 
 
class ExampleC
 
{
 
    public function methodWithDependencies(ExampleA $a, ExampleB $b, $customInteger, $customString)
 
    {
 
        var_dump($a->variable, $b->uniqueId, $customInteger, $customString);
 
    }
 
}
 
 
// Creates new instance of ExampleB and returns it
 
$exampleBOne = AutoDi::getInstance(ExampleB::class);
 
 
// Gets already created instance of ExampleB (Singleton)
 
$exampleBTwo = AutoDi::getInstance(ExampleB::class);
 
 
// Creates new instance of ExampleB without affecting previous
 
$exampleBThree = AutoDi::getNewInstance(ExampleB::class);
 
 
// Set value in $exampleBOne
 
$exampleBOne->uniqueId = 'this value SHOULD NOT be printed out!!!';
 
 
// Set value in $exampleBThree
 
$exampleBThree->uniqueId = 'this value is for itself';
 
 
// Set value in $exampleBTwo
 
$exampleBTwo->uniqueId = 'this value SHOULD be printed out!!!';
 
 
// Executes method "methodWithDependencies" from object (ExampleC)
 
// last argument are parameters of method that are scalar type or non typed
 
// e.g:
 
//
 
//  methodWithDependencies(ExampleA $a, ExampleB $b, $customInteger, $customString)
 
//    AutoDi will inject first and second parameter (ExampleA and ExampleB) and use
 
//    values from array that is last argument of AutoDi::autoInvoke
 
//
 
// if method looked something like this
 
//    methodWithDependencies(ExampleA $a, $customInteger, ExampleB $b, $customString)
 
//     AutoDi will map non typed parameters with array elements, so $customInteger and $customString
 
//    will be same as in previous example because of order
 
AutoDi::autoInvoke(AutoDi::getInstance(ExampleC::class), 'methodWithDependencies', [1, 'string']);
 
 |