就不貼我的代碼了,這里直接新安裝webman測(cè)試。
// 安裝webman框架
composer create-project workerman/webman
// 進(jìn)入目錄
cd webman
// 安裝依賴注入 PHP-DI
composer require psr/container ^1.1.1 php-di/php-di ^6.3 doctrine/annotations ^1.14
config/app.php
return [
省略其他……
'controller_reuse' => false, // 控制器復(fù)用已關(guān)閉
]
config/container.php
$builder = new \DI\ContainerBuilder();
$builder->addDefinitions(config('dependence', []));
$builder->useAutowiring(true);
$builder->useAnnotations(true);
return $builder->build();
·
·
·
構(gòu)造注入時(shí) IndexController.php 代碼如下
<?php
namespace app\controller;
use app\Test;
class IndexController
{
public function __construct(Test $test)
{
var_dump($test->get());
}
public function index()
{
}
}
控制臺(tái)輸出(始終為單例):
string(15) "執(zhí)行了構(gòu)造"
string(9) "獲取get"
string(9) "獲取get"
string(9) "獲取get"
當(dāng)控制器方法注入時(shí) IndexController.php代碼如下
<?php
namespace app\controller;
use app\Test;
class IndexController
{
public function index(Test $test)
{
var_dump($test->get());
}
}
控制臺(tái)輸出(如我預(yù)期一致,每次新實(shí)例):
string(15) "執(zhí)行了構(gòu)造"
string(9) "獲取get"
string(15) "執(zhí)行了構(gòu)造"
string(9) "獲取get"
string(15) "執(zhí)行了構(gòu)造"
string(9) "獲取get"
已做嘗試:
升級(jí)PHP-DI為7(控制器構(gòu)造注入依然為單例)
在dependence.php配置為非單例,控制器構(gòu)造仍然為單例。
·
·
有知道怎么回事的老哥么?
控制器構(gòu)造注入始終為單例。
控制器方法注入除了注入類,其他也都是單例。比如:A -> B、C、D
只有A是新實(shí)例,B、C、D均為單例。
應(yīng)該是PHP-DI內(nèi)部復(fù)用了實(shí)例。寫個(gè)腳本測(cè)試下類似如下代碼
$builder = new \DI\ContainerBuilder();
$builder->addDefinitions(config('dependence', []));
$builder->useAutowiring(true);
$builder->useAnnotations(true);
$container = $builder->build();
$container->make($class);
$container->make($class);
<?php
require __DIR__ . '/vendor/autoload.php';
class IndexController
{
public function __construct(Test $test)
{
var_dump($test->get());
}
}
class Test
{
public function __construct()
{
echo "Test __construct\n";
}
public function get()
{
return 'test';
}
}
$builder = new \DI\ContainerBuilder();
$builder->addDefinitions(config('dependence', []));
$builder->useAutowiring(true);
$builder->useAnnotations(true);
$container = $builder->build();
$container->make(IndexController::class);
$container->make(IndexController::class);
$container->make(IndexController::class);
結(jié)果
php .\container.php
Test __construct
string(4) "test"
string(4) "test"
string(4) "test"
PHP-DI make的時(shí)候構(gòu)造函數(shù)里依賴的類實(shí)例被復(fù)用了