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 26 27 28 29 30
| class IoC {
protected static $_registry = array();
public function register ($name, Closure $fct) {
static::$_registry[(string)$name] = $fct;
}
public function resolve ($name) {
$fct = static::$_registry[(string)$name];
return inject($fct);
}
}
function inject (Closure $fct) {
$reflect = new ReflectionFunction($fct);
foreach ($reflect->getParameters() as $parameter) {
$name = $parameter->name;
$context[$name] = IoC::resolve($name);
}
return !empty($context) ? $reflect->invokeArgs($context) : $reflect->invoke();
}
IoC::register('a', function () { return "a"; });
IoC::register('b', function ($a) { return "{$a}b"; });
IoC::register('c', function ($b) { return "{$b}c"; });
inject(function ($a,$b,$c) {
var_dump($a,$b,$c);
}); |
Partager