<?php
class Request {
public $answer = 42;
public function __construct() {
echo 'Request created', PHP_EOL;
}
}
class DI {
protected $shared = [];
protected $definitions = [];
public function __construct() {}
public function set($name, $definition, $shared = false) {
if($shared) {
if(isset($shared[$name])) {
throw new Exception("Definition '$name' is already set. Use DI::remove('$name') to remove it.");
}
$this->shared[$name] = $definition;
} else {
if(isset($definitions[$name])) {
throw new Exception("Definition '$name' is already set. Use DI::remove('$name') to remove it.");
}
$this->definitions[$name] = $definition;
}
}
public function getRaw($name) {
if(!isset($this->definitions[$name])) {
throw new Exception("Definition '$name' is not set. Use DI::set('$name', <definition>) to set it.");
}
return $this->definitions[$name];
}
public function get($name) {
$definition = $this->getRaw($name);
if(is_callable($definition)) return $definition();
if(class_exists($definition)) return new $definition();
}
public function getShared($name) {
if(!isset($this->shared[$name])) {
throw new Exception("Shared definition '$name' is not set. Use DI::set('$name', <definition>, true) to set it.");
}
$shared = $this->shared[$name];
if(is_callable($shared)) $this->shared[$name] = $shared();
else if(class_exists($shared)) $this->shared[$name] = new $shared();
return $this->shared[$name];
}
}
$di = new DI();
//Using an anonymous function
$di->set('request1', function(){
return new Request();
}, true);
//Using an anonymous function
$di->set('request2', 'Request', true);
$request = $di->getShared('request2');
var_dump($request);