singleton和bind都是返回一个类的实例,不同的是singleton是单例模式,而bind是每次返回一个新的实例。
1、singleton
1 2 3 4 5 6 7 8 9 10 | class fun { public $strKey ; } app()->singleton( 'fun' , fun:: class ); $fun1 = app()->make( 'fun' ); $fun2 = app()->make( 'fun' ); $fun1 ->strKey = "fun1" ; $fun2 ->strKey = "fun2" ; echo $fun1 ->strKey . ' ' . $fun2 ->strKey; |
最后获取到的结果是fun2 fun2
2、bind
1 2 3 4 5 6 7 8 9 10 | class fun { public $strKey ; } app()->bind( 'fun' , fun:: class ); $fun1 = app()->make( 'fun' ); $fun2 = app()->make( 'fun' ); $fun1 ->strKey = "fun1" ; $fun2 ->strKey = "fun2" ; echo $fun1 ->strKey . ' ' . $fun2 ->strKey; |
最后获取到的结果是fun1 fun2
再看框架底层代码:
1 2 3 4 | public function singleton( $abstract , $concrete = null) { $this ->bind( $abstract , $concrete , true); } |
发现singleton方法其实也是调用bind方法,只是最后一个参数是true,表示单例模式。框架源代码:Illuminate/Container/Container.php