Продължавам с темата за DI
. Контейнерът работи нормално, но стои въпросът как да го ъпдейтна за да мога инжектирам сингълтони? Искам да попитам също, лошо ли е ако самия контейнер е сингълтон? И последно ако мислите че изобщо не трябва да използвам сингълтони, то тогава как да процедирам с класове, като например конекцията към базата данни, когато ми трябва една и съща конекция на много различни места?
Код:
namespace application;
class Container {
private static $_instance = NULL;
private function __construct() {
}
/** @return \application\Container */
public static function getInstance() {
if (self::$_instance === NULL) {
self::$_instance = new self();
}
return self::$_instance;
}
public function make($class) {
$reflector = new \ReflectionClass($class);
if (!$reflector -> isInstantiable()) {
throw new \Exception('This Class ' . $class . ' Is Not Instantiable In: ' . __METHOD__, 500);
}
$constructor = $reflector -> getConstructor();
if (is_null($constructor)) {
return new $class;
}
$parameters = $constructor -> getParameters();
$dependencies = $this -> getDependencies($parameters);
return $reflector -> newInstanceArgs($dependencies);
}
public function getDependencies($parameters) {
$dependencies = array();
foreach ($parameters as $parameter) {
$dependency = $parameter -> getClass();
if (is_null($dependency)) {
$dependencies[] = $this -> makeNoClass($parameter);
}
else {
$dependencies[] = $this -> make($dependency -> getName());
}
}
return $dependencies;
}
public function makeNoClass(ReflectionParameter $parameter) {
if ($parameter -> isDefaultValueAvailable()) {
return $parameter -> getDefaultValue();
}
throw new \Exception('This Parameter ' . $parameter . ' Is Unknown In: ' . __METHOD__, 500);
}
}