2016-04-18 2 views
0

Я создаю свой собственный контейнер, я создал метод «bind», который получает «строковый псевдоним» и «Закрытие $ закрытия». способ связать псевдоним объекта в массиве $ контейнера, так:Что добавить в мой контейнер ioc? php

public function bind(string $alias,$closure) 
{ 
    $this->container[$alias] = $closure(); 
} 

Второй метод «вызов», который просто позвонить в какой-то экземпляр от $ контейнера. Конечно, сначала метод проверяет, существует ли данный псевдоним, и если не выбрасывает исключение

public function call(string $alias) 
{ 
    if(array_key_exists($alias,$this->container)) 
     return $this->container[$alias]; 
    throw new \Exception(); 
} 

это хорошо? что мне нужно добавить? потому что я видел на laravel, например, что контейнер полон метода и реквизита, и я не знаю почему. его просто связать и позвонить, разве?

+0

Я лично сохранил бы закрытие и позвонил по требованию, а не по связи. С одной стороны, вам может не понадобиться все связанные объекты во время одного вызова, поэтому вы сохраняете при распределении ресурсов, с другой стороны, состояние связанного объекта может зависеть от того, когда он называется скорее, когда его привязка. – apokryfos

+0

Почему мне нужно сохранить закрытие? что я могу с этим сделать? – user412499

ответ

0

Мое предложение сделать следующее:

BIND

public function bind(string $alias,$closure) 
{ 
    $this->container[$alias] = $closure; 
} 

вызова (новый экземпляр за звонок)

public function call(string $alias) 
{ 
    if(array_key_exists($alias,$this->container)) { 
     $closure = $this->container[$alias]; 
     return $closure(); 
    } 
    throw new \Exception(); 
} 

вызова (Singleton поведение)

public function call(string $alias) 
{ 
    if (array_key_exists($alias,$this->instanceContainer)) { 
     return $this->instanceContainer[$alias]; 
    }   
    if(array_key_exists($alias,$this->container)) { 
     $closure = $this->container[$alias]; 
     $this->instanceContainer[$alias] = $closure(); 
     return $this->instanceContainer[$alias]; 
    } 
    throw new \Exception(); 
} 

Какая из двух реализаций, выбранных для вызова, будет зависеть от ваших потребностей. Если вам нужно вызвать функцию только один раз для объекта, перейдите для второго. Вы также можете использовать 2 метода: bind и bindSingleton, чтобы различать два разных типа привязки.

Есть две основные причины, которые я рекомендую это:

  1. Объект генерируется по требованию, а это означает, что если вы свяжете 1000 объектов, но использовать только 10 вы будете создавать только 10 объектов.

  2. Результат метода $closure() может отличаться в зависимости от времени его вызова. Например, если вы хотите создать экземпляр объекта, который содержит метку времени, более разумным является создание экземпляра на вызов, а не на bind.

+0

и $ instanceContainer для однопоточных привязок? – user412499

+0

, и вы можете привести пример для вещей, которые не нужны синглтон и вещи, которые мне не нужны? – user412499

+0

Если у вас есть функция, которая создает соединение с базой данных, то это, как правило, singleton, так как вы будете создавать его один раз и использовать его повсюду. Если у вас есть функция, которая, например, сгенерируйте экземпляр модели, основанной на записи базы данных, тогда вам нужно будет создавать новый экземпляр каждый раз, так как вам может потребоваться инициализация другой записи базы данных. – apokryfos