向我的容器添加什么?php

向我的容器添加什么?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调用某个实例。当然,该方法首先检查给定的别名是否存在,如果不存在,则

我创建了自己的容器,我创建了“bind”方法,该方法获得“string$alias”和“Closure$Closure”。该方法将别名绑定到$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
来区分这两种不同的绑定类型

我建议这样做有两个主要原因:

  • 对象是按需生成的,这意味着如果绑定1000个对象,但仅使用10个,则只能创建10个对象

  • $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();
    }