# 容器 > 这里的容器主要作用有两个,实现一些类的单例,实现构造方法、普通方法和闭包的依赖注入 ## 实例化类 > 使用容器实例化类 ~~~ $obj = \Max\Facade\App::make($className,$arguments = [],$singleInstance = false); ~~~ 第一个参数传入一个完整类名,第二个参数是传递给类构造方法的参数列表数组,第三个参数为true时候表示获取一个单例,在后面请求中获取类实例的`$singleInstance` 为`true`的时候始终不会创建新对象,而是从容器中获取已经实例化并且依赖注入的对象。 此时`$obj`是一个给构造方法实现依赖注入的实例,在后面的调用实例的方法时候并不会给方法实现依赖注入 > 可以使用框架提供的`app()`助手函数,函数可选多个参数,当不传递参数的时候会返回`app`实例,否则第一个参数接受一个字符串,容器会实例化该类 ## 方法调用 > 使用容器调用实例的方法 ~~~ \Max\Facade\App::invokeMethod([$className,$method],$arguments = [],$singleInstance = false,$constructorArguments = []); ~~~ 第一个参数为一个数组,数组的第一个元素为需要实例化的类名,第二个元素为要调用的方法名。第二个参数为给方法传递的参数列表,第三个方法表示实例化的类是不是单例的,第四个参数为实例化类过程中给构造方法传递的参数列表 > 可以使用框架提供的助手函数`invoke()` ## 闭包的依赖注入 ``` \Max\Facade\App::invokeFunc(function(){ //... },array $arguments); ``` > 可以使用框架提供的助手函数`invoke()` ## 获取实例 > 获取容器内的实例可以使用`get`方法 ~~~ \Max\Facade\App::get($className); ~~~ > 获取实例可以使用还可以使用`make`方法,`app`实例的对象属性访问方式,`app`实例的属性数组访问方式。 ## 判断实例存在与否 > 判断容器中的实例是否存在可以使用 ~~~ \Max\Facade\App::has($abstract); ~~~ ## 绑定类和类的标识 ```php \Max\Facade\App::bind($id, $className); ``` 后面就可以使用$id 来获取实例,而不是使用类名,例如`app($id)` 可以直接取得`$id`的实例 ## 移除实例 ```php \Max\Facade\App::remove($className); ``` 顾名思义,可以移除存放在容器中的实例,`$className` 可以是类的标识,也可以是完整类名 ## 通过标识获取类名 ```php \Max\Facade\App::bound($id) ``` > 注意:控制器方法是始终实现依赖注入的。