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