Laravel中使用Ioc容器的singleton方法和bind方法建立实例有什么区别呢?它们两个都是返回一个类的实例,不一样的是singleton是单例模式,而bind是每次返回一个新的实例,看下面的两个例子。php
1.Ioc容器bind方法bootstrap
<?php require __DIR__.'/../bootstrap/autoload.php'; class tanteng { public $name; } $container = new Illuminate\Container\Container(); $container->bind('tanteng'); $instance = $container->make('tanteng'); $instance->name = 'tanteng'; $instance2 = $container->make('tanteng'); $instance2->name = 'tuntun'; echo $instance->name.' '.$instance2->name;
输出的结果:框架
tanteng tuntunui
结论:this
经过bind方法建立实例不是单例模式,而是建立新的实例。code
2.Ioc容器singleton方法io
<?php require __DIR__.'/../bootstrap/autoload.php'; class single { public $value; } $container = new Illuminate\Container\Container(); $container->singleton('single'); $instance3 = $container->make('single'); $instance4 = $container->make('single'); $instance3->value = 'aaaa'; $instance4->value = 'bbbb'; echo $instance3->value.' '.$instance4->value;
输出结果:function
bbbb bbbbclass
结论:test
使用singleton建立实例使用的是单例模式,每次返回同一个实例。
以上代码能够放在public下,如test.php运行。
再看框架底层代码:
public function singleton($abstract, $concrete = null) { $this->bind($abstract, $concrete, true); }
发现singleton方法其实也是调用bind方法,只是最后一个参数是true,表示单例模式。框架源代码:Illuminate/Container/Container.php