@ 2017-07-24T12:11:41Z <?php
// The smallest, ugliest autowiring container.
function dep_set($n, $v) {
$GLOBALS['deps'][$n] = $v;
}
function dep_get($n) {
$v = &$GLOBALS['deps'][$n];
if (!$v) $v = $n;
$r = $v instanceof Closure ? new ReflectionFunction($v) : (new ReflectionClass($n))->getConstructor();
$a = [];
foreach ($r->getParameters() as $i => $p) {
$pc = $p->getClass();
if (!$pc) throw new Exception('Cannot magically resolve a param $' . $p->name . ' without class typehint');
$pn = $pc->name;
$a[] = dep_get(isset($GLOBALS['deps'][$n . '@' . $pn]) ? $n . '@' . $pn : $pn);
}
$v = $v instanceof Closure ? $v(...$a) : new $v(...$a);
return $v;
}
// Usage:
class A {
function __construct($a, $b) {
echo $a + $b; // 3
}
function b() {
echo 4;
}
}
class B {
function __construct(A $a) {
$a->b();
}
}
class C {
function __construct(B $a) {
}
}
dep_set(A::class, function () {
return new A(1, 2);
});
$c = dep_get(C::class); // Instantiates A, B, C and prints "34"
Enable javascript to submit You have javascript disabled. You will not be able to edit any code.
Output for 8.0.0 - 8.0.30 , 8.1.0 - 8.1.29 , 8.2.0 - 8.2.21 , 8.3.0 - 8.3.9 Deprecated: Method ReflectionParameter::getClass() is deprecated in /in/tbe6i on line 14
Deprecated: Method ReflectionParameter::getClass() is deprecated in /in/tbe6i on line 14
34 Output for 7.0.0 - 7.0.20 , 7.1.0 - 7.1.25 , 7.2.0 - 7.2.33 , 7.3.0 - 7.3.33 , 7.4.0 - 7.4.33 34 preferences:dark mode live preview
84.1 ms | 404 KiB | 194 Q