Laravel Ioc容器singleton和bind方法的區別

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

相關文章
相關標籤/搜索