看laravel
中Comtroller
发现,类依赖注入时,当我通过make
创建对象时,发现依赖被创建了多份实例。
代码如下:
<?php
namespace Tests\Unit;
use Illuminate\Container\Container;
use Tests\TestCase;
interface SessionStorage
{
public function get($key);
public function set($key, $value);
}
class FileSessionStorage implements SessionStorage
{
public function __construct()
{
echo "file init \n";
}
public function get($key)
{
// TODO: Implement get() method.
}
public function set($key, $value)
{
// TODO: Implement set() method.
}
}
class MySqlSessionStorage implements SessionStorage
{
public function __construct()
{
echo "mysql init \n";
}
public function get($key)
{
// TODO: Implement get() method.
}
public function set($key, $value)
{
// TODO: Implement set() method.
}
}
class SimpleAuth
{
protected $session;
public function __construct(SessionStorage $session)
{
$this->session = $session;
}
public function get()
{
$this->session->get(null);
}
}
class ExampleTest extends TestCase
{
/**
* A basic test example.
*
* @return void
*/
public function testBasicTest()
{
$container = Container::getInstance();
$container->bind( SessionStorage::class, MysqlSessionStorage::class );
$container->make(SimpleAuth::class);
echo "-\n";
$container->bind( SessionStorage::class, FileSessionStorage::class );
$container->make(SimpleAuth::class);
echo "-\n";
$container->bind( SessionStorage::class, MysqlSessionStorage::class );
$container->make(SimpleAuth::class);
}
}
代码的输出结果如下:
跟预期不同的地方:
make
操作的时候,通过构造函数的输出,可以看出,依赖关系仅仅被实例化了一次bind
,make
发现构造函数被调用了两次mysql init
-
file init
file init
-
mysql init
mysql init
尝试debug
:在make函数中记录调用的次数。:
public function make($abstract, array $parameters = [])
{
if (stripos($abstract, 'SessionStorage') !== false) {
echo "make plus \n";
}
return $this->resolve($abstract, $parameters);
}
=================== 输出结果 =================
make plus
make plus
mysql init
-
make plus
make plus
file init
make plus
make plus
file init
-
make plus
make plus
mysql init
make plus
make plus
mysql init
怎么破!!!
繁星coding