Phalcon\Di

为一个容器里,用于服务的依赖注入,Di类本身只提供了注入功能,并不会默认绑定服务

Phalcon\Di\FactoryDefault

为一个默认容器类,其为Di的子类,会默认注入mvc使用的大部分服务

Phalcon\Di\FactoryDefault\Cli

与FactoryDefault相同,只不过默认只注入了一些用于Cli模式的服务


use Phalcon\Di;
/**
 * 此处也可以根据使用情景使用不同的Di,比如:
 * use Phalcon\Di\FactoryDefault as Di; 使用FactoryDefault作为Di
 * use Phalcon\Di\FactoryDefault\Cli as Di; 使用Cli作为Di
 */
// 声明一个Di的实例
$di = new Di();
/**
 * 定义一个Test类,作为后面做服务的测试
 */
class Test
{
    private $id;

    private $num1;

    private $num2;

    public function __construct($num1 = 0, $num2 = 0)
    {
        // 随机生成id的值,这样以便后面观察单例模式
        $this->id = rand(0, 99999);
        $this->num1 = $num1;
        $this->num2 = $num2;
    }
    
    public function setNum1($num1)
    {
        $this->num1 = $num1;
    }

    public function setNum2($num2)
    {
        $this->num2 = $num2;
    }
}
// 注册一个名为test的服务,使用匿名函数方式
$test_service = $di->set('test', function ($num1, $num2) {
    return new Test($num1, $num2);
});
// 使用数组方式注册一个服务,使用构造方式注入值
$test_service = $di->set('test', [
    'className' => 'Test',
    'arguments' => [
        [
            'type' => 'parameter',
            'value' => 10
        ],
        [
            'type' => 'parameter',
            'value' => 15
        ]
    ]
]);
// 使用数组方式注册一个服务,使用赋值方式注入值
$test_service = $di->set('test', [
    'className' => 'Test',
    'calls' => [
        [
            'method' => 'setNum1',
            'arguments' => [
                [
                    'type' => 'parameter',
                    'value' => 11
                ]
            ]
        ],
        [
            'method' => 'setNum2',
            'arguments' => [
                [
                    'type' => 'parameter',
                    'value' => 13
                ]
            ]
        ]
    ]
]);
// 可以观察到test_service为一个Phalcon\Di\Service的实例
var_dump($test_service);
// 可以使用两种方式来获取刚刚注册的test类实例
// 第一种,使用Di来获取,可以用下面几种方式
$di->get('test', [3, 4]);
$di->getTest(3, 4);
// 使用数组方式时注册的匿名函数不能有参数
$di['test'];
// 使用getService方式注册的匿名函数不能带有参数
$di->getService('test');
// 使用刚刚生成的test_service来获取实例
$test_service->resolve();
// 可以看到上面每个生成的test类的id都不一样。说明每个test类的实例都是重新生成的
// 作为服务,可能大部分时候都是使用单例模式,那么就需要使用setShared来注册服务。
$di->setShared('test', function () {
    return new Test();
});