Файл: Neiron/Kernel/DIContainer.php
Строк: 105
<?php
/**
* PHP 5x framework с открытым иходным кодом
*/
namespace NeironKernel;
use NeironAPIKernelDIContainerInterface;
/**
* Dependency injection Контейнер
* @author KpuTuK
* @version 1.0.0
* @package Neiron framework
* @category Kernel
* @link
*/
class DIContainer implements DIContainerInterface
{
/**
* Контейнер
* @var array
*/
private $container = array();
/**
* Конструктор класса
* @param array $values
*/
public function __construct(array $values = array())
{
foreach ($values as $offset => $value) {
$this->offsetSet($offset, $value);
}
}
/**
* Создает функцию при вызове которой каждый раз будет вызван конструктор класса
* @param string $name Имя функции
* @param mixed $class Пространство имен или обьект класса
*/
public function setInstance($name, $class)
{
$this->offsetSet($name, function ($values) use ($class) {
if (is_object($class)) {
return (new ReflectionObject($class))->newInstance($values);
}
return new $class($values);
});
}
/**
* Меняет содержимое в контейнере по ключу
* @param string $name
* @param mixed $value
*/
public function rewind($name, $value)
{
$this->offsetUnset($name);
$this->offsetSet($name, $value);
}
/**
* Проверяет наличие параметра в контейнере
* @param string $offset Проверяемый параметр
* @return bool true параметр найден или false если параметр отсутсвует
*/
public function offsetExists($offset)
{
return array_key_exists($offset, $this->container);
}
/**
* Сохраняет содержимое в контейнер по ключу
* @param string $offset Ключ
* @param mixed $value Сохраняемое содержимое
* @throws InvalidArgumentException Исключение выбрасываемое в случае если ключ уже существует в контейнере
*/
public function offsetSet($offset, $value)
{
if ($this->offsetExists($offset)) {
throw new InvalidArgumentException(
sprintf('Параметр "%s" уже существует!', $offset)
);
}
$this->container[$offset] = $value;
}
/**
* Возвращает содержимое контейнера по ключу
* @param string $offset Ключ содержимого
* @return mixed Содержимое
* @throws InvalidArgumentException Исключение выбрасываемое в случае отсутствия ключа в контейнере
*/
public function offsetGet($offset)
{
if (!$this->offsetExists($offset)) {
throw new InvalidArgumentException(
sprintf('Параметр "%s" не существует!', $offset)
);
}
return $this->container[$offset];
}
/**
* Удаляет содержимое по ключу в контейнере
* @param string $offset Ключ содержимого
* @throws InvalidArgumentException Исключение выбрасываемое в случае отсутствия ключа в контейнере
*/
public function offsetUnset($offset)
{
if (!$this->offsetExists($offset)) {
throw new InvalidArgumentException(
sprintf('Параметр "%s" не существует!', $offset)
);
}
unset($this->container[$offset]);
}
}