<?php
class SomeComponent
{
public function doSomething()
{
}
}
class App
{
public function __construct(SomeComponent $theComponent)
{
$this->theComponent = $theComponent;
}
public function run()
{
$this->theComponent->doSomething();
}
}
class DIContainer{
public function get($className) {
switch ($className) {
case SomeComponent::class:
return new SomeComponent;
case App::class:
return new App($this->get(SomeComponent::class));
default:
throw new Exception;
}
}
}
$DIContainer = new DIContainer();
$app = $DIContainer->get(App::class);
$app->run();
PD9waHAKCmNsYXNzIFNvbWVDb21wb25lbnQKewogIHB1YmxpYyBmdW5jdGlvbiBkb1NvbWV0aGluZygpCiAgewogIH0KfQoKY2xhc3MgQXBwCnsKICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoU29tZUNvbXBvbmVudCAkdGhlQ29tcG9uZW50KQogIHsKICAgICR0aGlzLT50aGVDb21wb25lbnQgPSAkdGhlQ29tcG9uZW50OwogIH0KCiAgcHVibGljIGZ1bmN0aW9uIHJ1bigpCiAgewogICAgJHRoaXMtPnRoZUNvbXBvbmVudC0+ZG9Tb21ldGhpbmcoKTsKICB9Cn0KCmNsYXNzIERJQ29udGFpbmVyewogIHB1YmxpYyBmdW5jdGlvbiBnZXQoJGNsYXNzTmFtZSkgIHsKICAgIHN3aXRjaCAoJGNsYXNzTmFtZSkgewogICAgICBjYXNlIFNvbWVDb21wb25lbnQ6OmNsYXNzOgogICAgICAgIHJldHVybiBuZXcgU29tZUNvbXBvbmVudDsKICAgICAgY2FzZSBBcHA6OmNsYXNzOgogICAgICAgIHJldHVybiBuZXcgQXBwKCR0aGlzLT5nZXQoU29tZUNvbXBvbmVudDo6Y2xhc3MpKTsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uOwogICAgfQogIH0KfQoKJERJQ29udGFpbmVyID0gbmV3IERJQ29udGFpbmVyKCk7CiRhcHAgPSAkRElDb250YWluZXItPmdldChBcHA6OmNsYXNzKTsKJGFwcC0+cnVuKCk7