0 关注者

类 yii\di\Instance

继承yii\di\Instance
可用版本2.0
源代码 https://github.com/yiisoft/yii2/blob/master/framework/di/Instance.php

Instance 代表依赖注入 (DI) 容器或服务定位器中命名对象的引用。

您可以使用 get() 获取 $id 引用的实际对象。

Instance 主要用于以下两个地方

  • 在配置依赖注入容器时,您使用 Instance 来引用类名、接口名或别名。该引用随后可由容器解析为实际对象。
  • 在使用服务定位器获取依赖对象的类中。

以下示例展示了如何使用 Instance 配置 DI 容器

$container = new \yii\di\Container;
$container->set('cache', [
    'class' => 'yii\caching\DbCache',
    'db' => Instance::of('db')
]);
$container->set('db', [
    'class' => 'yii\db\Connection',
    'dsn' => 'sqlite:path/to/file.db',
]);

以下示例展示了类如何从服务定位器中检索组件

class DbCache extends Cache
{
    public $db = 'db';

    public function init()
    {
        parent::init();
        $this->db = Instance::ensure($this->db, 'yii\db\Connection');
    }
}

公共属性

隐藏继承的属性

属性 类型 描述 定义于
$id string 组件 ID、类名、接口名或别名 yii\di\Instance
$optional boolean 如果应返回 null 而不是抛出异常 yii\di\Instance

公共方法

隐藏继承的方法

方法 描述 定义于
__set_state() 使用 var_export() 后恢复类状态。 yii\di\Instance
ensure() 将指定的引用解析为实际对象并确保其为指定的类型。 yii\di\Instance
get() 返回此 Instance 对象引用的实际对象。 yii\di\Instance
of() 创建一个新的 Instance 对象。 yii\di\Instance

受保护的方法

隐藏继承的方法

方法 描述 定义于
__construct() 构造函数。 yii\di\Instance

属性详细信息

隐藏继承的属性

$id 公共属性

组件 ID、类名、接口名或别名

public string $id null
$optional 公共属性

如果应返回 null 而不是抛出异常

public boolean $optional null

方法详细信息

隐藏继承的方法

__construct() 受保护方法

构造函数。

protected void __construct ( $id, $optional false )
$id string

组件 ID

$optional boolean

如果应返回 null 而不是抛出异常

                protected function __construct($id, $optional = false)
{
    $this->id = $id;
    $this->optional = $optional;
}

            
__set_state() 公共静态方法 (可用版本 2.0.12)

使用 var_export() 后恢复类状态。

另见 https://php.ac.cn/manual/en/function.var-export.php.

public static yii\di\Instance __set_state ( $state )
$state array
抛出 yii\base\InvalidConfigException

当 $state 属性不包含 id 参数时

                public static function __set_state($state)
{
    if (!isset($state['id'])) {
        throw new InvalidConfigException('Failed to instantiate class "Instance". Required parameter "id" is missing');
    }
    return new self($state['id']);
}

            
ensure() 公共静态方法

将指定的引用解析为实际对象并确保其为指定的类型。

引用可以指定为字符串或 Instance 对象。如果前者,则根据容器类型将其视为组件 ID、类/接口名或别名。

如果您未指定容器,则该方法将首先尝试 Yii::$app,然后尝试 Yii::$container

例如:

use yii\db\Connection;

// returns Yii::$app->db
$db = Instance::ensure('db', Connection::class);
// returns an instance of Connection using the given configuration
$db = Instance::ensure(['dsn' => 'sqlite:path/to/my.db'], Connection::class);
public static object ensure ( $reference, $type null, $container null )
$reference object|string|array|static

对象或对所需对象的引用。您可以使用组件 ID 或 Instance 对象指定引用。从版本 2.0.2 开始,您也可以传递配置数组以创建对象。如果配置数组中未指定“class”值,它将使用 $type 的值。

$type string|null

要检查的类/接口名称。如果为 null,则不执行类型检查。

$container yii\di\ServiceLocator|yii\di\Container|null

容器。这将传递给 get()

返回 对象

Instance 引用的对象,如果它是一个对象,则为 $reference 本身。

抛出 yii\base\InvalidConfigException

如果引用无效

                public static function ensure($reference, $type = null, $container = null)
{
    if (is_array($reference)) {
        $class = isset($reference['class']) ? $reference['class'] : $type;
        if (!$container instanceof Container) {
            $container = Yii::$container;
        }
        unset($reference['class']);
        $component = $container->get($class, [], $reference);
        if ($type === null || $component instanceof $type) {
            return $component;
        }
        throw new InvalidConfigException('Invalid data type: ' . $class . '. ' . $type . ' is expected.');
    } elseif (empty($reference)) {
        throw new InvalidConfigException('The required component is not specified.');
    }
    if (is_string($reference)) {
        $reference = new static($reference);
    } elseif ($type === null || $reference instanceof $type) {
        return $reference;
    }
    if ($reference instanceof self) {
        try {
            $component = $reference->get($container);
        } catch (\ReflectionException $e) {
            throw new InvalidConfigException('Failed to instantiate component or class "' . $reference->id . '".', 0, $e);
        }
        if ($type === null || $component instanceof $type) {
            return $component;
        }
        throw new InvalidConfigException('"' . $reference->id . '" refers to a ' . get_class($component) . " component. $type is expected.");
    }
    $valueType = is_object($reference) ? get_class($reference) : gettype($reference);
    throw new InvalidConfigException("Invalid data type: $valueType. $type is expected.");
}

            
get() 公共方法

返回此 Instance 对象引用的实际对象。

public object get ( $container null )
$container yii\di\ServiceLocator|yii\di\Container|null

用于查找引用对象的容器。如果为 null,则该方法将首先尝试 Yii::$app,然后尝试 Yii::$container

返回 对象

此 Instance 对象引用的实际对象。

                public function get($container = null)
{
    try {
        if ($container) {
            return $container->get($this->id);
        }
        if (Yii::$app && Yii::$app->has($this->id)) {
            return Yii::$app->get($this->id);
        }
        return Yii::$container->get($this->id);
    } catch (\Exception $e) {
        if ($this->optional) {
            return null;
        }
        throw $e;
    } catch (\Throwable $e) {
        if ($this->optional) {
            return null;
        }
        throw $e;
    }
}

            
of() 公共静态方法

创建一个新的 Instance 对象。

public static yii\di\Instance of ( $id, $optional false )
$id string

组件 ID

$optional boolean

如果应返回 null 而不是抛出异常

返回 yii\di\Instance

新的 Instance 对象。

                public static function of($id, $optional = false)
{
    return new static($id, $optional);
}