Contents

PHP-DI 簡單自動注入小記

最近跑去看 PHP-DI
簡單實作小記

簡單講解

在使用 Spring boot 和 Laravel 上,常常看到自動注入的範例
很多文章沒有深入講解為什麼可以做自動注入

這段時間我使用到 Spring boot 的 @autowired 做自動注入
明白在框架中有有一個機制在控制你裡面放的需要 new 出來的物件
在使用上可以說
最近再回頭看 php-di 就突然了解了

更多講解可以看Laravel 實作小記 | 程式狂想筆記
之前有記錄幾個網站有詳細談到

自動注入

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
include './vendor/autoload.php';

# 第 1 步: 建立 DI container
$builder = new \DI\ContainerBuilder();
$container = $builder->build();

# 第 2 步: 建立 class 
$a = $container->get('A');

var_dump($a);

# 第 3 步: 建立 DI 實作 class,B class 不需要做 new 動作
class A{
    private $_b;
    function __construct(B $b)
    {
        $this->_b = $b;
        // $b->hello();
    }
}

class B{
    function __construct()
    {
        echo "Hello World! B";
    }
    function hello()
    {
        echo "B:say hello";
    }
}

autowiring 出來都是單例模式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
include './vendor/autoload.php';


$builder = new \DI\ContainerBuilder();
$container = $builder->build();


$a = $container->get('A');
$a_b = $a->get_B();
$b = $container->get('B');
var_dump($a_b === $b); # true

class A{
    private $_b;
    function __construct(B $b)
    {
        $this->_b = $b;
        // $b->hello();
    }

    function get_B()
    {
        return $this->_b;
    }
}

class B{
    function __construct()
    {
        echo "Hello World! B";
    }
    function hello()
    {
        echo "B:say hello";
    }
}

BTW: Spring IOC 单例和多例 - 简书
hailindai/SSMSample