# 区别 我们直接说说区别是什么, 不理解再看后面的例子 1. bind 绑定的是一个实现类, 每次通过 `$this->app->make('Foo');` 调用的时候都会实例化一个新的对象 2. singleton 绑定的也是一个实现类, 不过每次通过 `$this->app->make('Foo');` 调用的时候返回的都是同一个实例对象(第一次调用创建那个) 3. instance 每次通过 `$this->app->make('Foo');` 调用返回的也都是同一个对象(第一次调用创建那个), 不过他第二个参数传的是现有的实例对象 # 服务绑定 假设你有一个需要绑定的服务类 ```php class Foo { public $name; } ``` ## 简单绑定 在服务提供者中,你总是可以通过 $this->app 属性访问容器。我们可以通过容器的 bind 方法注册绑定,bind 方法的第一个参数为要绑定的类 / 接口名,第二个参数是一个返回类实例的 Closure : ```php $this->app->bind('Foo', Foo::class); ``` ## 绑定一个单例 singleton 方法将类或接口绑定到只解析一次的容器中。一旦单例绑定被解析,相同的对象实例会在随后的调用中返回到容器中: ```php $this->app->singleton('Foo', Foo::class); ``` ## 绑定一个现有的实例 你也可以使用 instance 方法将现有对象实例绑定到容器中。给定的实例会始终在随后的调用中返回到容器中: ```php $foo = new Foo(); $this->app->instance('Foo', $foo); ``` ## 试一试 ### 使用 bind ```php class Foo { public $name; } $container = new \Illuminate\Container\Container(); $container->bind('Foo', Foo::class); $instance1 = $container->make('Foo'); $instance1->name = 'instance1'; $instance2 = $container->make('Foo'); $instance2->name = 'instance2'; echo $instance1->name . PHP_EOL; echo $instance2->name . PHP_EOL; 输出: instance1 instance2 ``` ### 使用 singleton ```php class Foo { public $name; } $container = new \Illuminate\Container\Container(); $container->singleton('Foo', Foo::class); $instance1 = $container->make('Foo'); $instance1->name = 'instance1'; $instance2 = $container->make('Foo'); $instance2->name = 'instance2'; echo $instance1->name . PHP_EOL; echo $instance2->name . PHP_EOL; 输出: instance2 instance2 ``` ### 使用 instance ```php class Foo { public $name; } $container = new \Illuminate\Container\Container(); $foo = new Foo(); $container->instance('Foo', $foo); $instance1 = $container->make('Foo'); $instance1->name = 'instance1'; $instance2 = $container->make('Foo'); $instance2->name = 'instance2'; echo $instance1->name . PHP_EOL; echo $instance2->name . PHP_EOL; 输出: instance2 instance2 ``` > Tip: 现在再看看顶部的区别, 是否可以理解了?