向我的容器添加什么?php
我创建了自己的容器,我创建了“bind”方法,该方法获得“string$alias”和“Closure$Closure”。该方法将别名绑定到$container数组上的对象,如下所示:向我的容器添加什么?php,php,design-patterns,containers,inversion-of-control,Php,Design Patterns,Containers,Inversion Of Control,我创建了自己的容器,我创建了“bind”方法,该方法获得“string$alias”和“Closure$Closure”。该方法将别名绑定到$container数组上的对象,如下所示: public function bind(string $alias,$closure) { $this->container[$alias] = $closure(); } 第二个方法是“call”,它只是从$container调用某个实例。当然,该方法首先检查给定的别名是否存在,如果不存在,则
public function bind(string $alias,$closure)
{
$this->container[$alias] = $closure();
}
第二个方法是“call”,它只是从$container调用某个实例。当然,该方法首先检查给定的别名是否存在,如果不存在,则抛出异常
public function call(string $alias)
{
if(array_key_exists($alias,$this->container))
return $this->container[$alias];
throw new \Exception();
}
那好吗?我还需要补充什么?因为我在laravel上看到,比如说,容器里装满了方法和道具,我不知道为什么。它只是绑定和调用,不是吗?我的建议是执行以下操作: 绑定
public function bind(string $alias,$closure)
{
$this->container[$alias] = $closure;
}
调用(每次调用新实例)
呼叫(单例行为)
您为调用选择两种实现中的哪一种将取决于您的需要。如果每个对象只需要调用函数一次,请选择第二个。您还可以使用两种方法:bind
和bindSingleton
来区分这两种不同的绑定类型
我建议这样做有两个主要原因:
$closure()
方法的结果可能因调用时间而异。例如,如果您想要实例化一个包含时间戳的对象,那么在调用时而不是绑定时实例化它更合理我个人会保存关闭,并在需要时调用它,而不是绑定。一方面,在一次调用过程中,您可能不需要所有绑定对象,因此可以节省资源分配,另一方面,绑定对象的状态可能取决于何时调用,而不是何时绑定。为什么需要保存闭包?我能用它做什么?和$instanceContainer用于单音绑定?你可以举例说明我需要单音绑定和我不需要的东西?如果你有一个创建数据库连接的函数,那么这通常是单音绑定,因为你只需要创建一次,然后在任何地方使用它。如果您有一个函数,例如根据数据库项生成模型实例,那么每次都需要创建一个新实例,因为您可能需要初始化不同的数据库项。我还考虑过删除bindSingleton并将callSingleton更改为调用参数方法:call($alias,$shared)
public function call(string $alias)
{
if(array_key_exists($alias,$this->container)) {
$closure = $this->container[$alias];
return $closure();
}
throw new \Exception();
}
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();
}