我有一个库,我想用它作为组件。在配置文件中,我这样设置它:
'components' => [ 'superLib' => [ 'class' => 'SuperLib' // '__construct' => [$first, $second] Maybe Yii 2 have property for this ], ],
如何将数据传递到__construct()?
__construct()
huwehgph1#
大多数情况下,您不必重写__construct()。Yii 2中的几乎每个对象都是从yii\base\Object扩展而来的,yii\base\Object通过配置数组特性具有赋值属性。Components是从yii\base\Component扩展而来的,后者也是从yii\base\Object扩展而来的。所以在你的例子中沿着类名(注意,你应该提供完整的类名和命名空间,而在你的例子中,它是在根命名空间中),你可以传递任何属性/值对:
yii\base\Object
'components' => [ 'superLib' => [ 'class' => 'SuperLib' 'firstProperty' => 'firstPropertyValue', 'secondProperty' => 'secondPropertyValue', ], ],
有时你需要使用init()方法(例如,检查值是否具有有效类型并抛出某种异常,设置默认值等):
public function init() { parent::init(); // Call parent implementation; ... }
以下是来自官方文档的一些有用信息:除了属性特性,Object还引入了一个重要的对象初始化生命周期。特别是,创建Object或其派生类的新示例将依次涉及以下生命周期:
init()
在上面的例子中,第2步和第3步都发生在类构造函数的末尾。建议您在init()方法中执行对象初始化,因为在该阶段,对象配置已经应用。为了保证上述生命周期,如果Object的子类需要重写构造函数,应该像下面这样做:
public function __construct($param1, $param2, ..., $config = []) { ... parent::__construct($config); }
也就是说,$config参数(默认为[])应该声明为构造函数的最后一个参数,并且应该在构造函数的末尾调用父实现。如果你想在__construct中使用额外的参数,你可以这样做:
$config
[]
__construct
'components' => [ 'superLib' => [ 'class' => 'app\components\SuperLib', ['firstParamValue', 'secondParamValue'], ], ],
你可以在第三个例子的官方文档中找到它。
qqrboqgw2#
使用__construct()而不是__contruct作为配置密钥:
__contruct
'components' => [ 'superLib' => [ 'class' => namespace\of\SomeClass::class '__construct()' => [$first, $second], ], ],
2条答案
按热度按时间huwehgph1#
大多数情况下,您不必重写
__construct()
。Yii 2中的几乎每个对象都是从yii\base\Object扩展而来的,yii\base\Object通过配置数组特性具有赋值属性。
Components是从yii\base\Component扩展而来的,后者也是从
yii\base\Object
扩展而来的。所以在你的例子中沿着类名(注意,你应该提供完整的类名和命名空间,而在你的例子中,它是在根命名空间中),你可以传递任何属性/值对:有时你需要使用init()方法(例如,检查值是否具有有效类型并抛出某种异常,设置默认值等):
以下是来自官方文档的一些有用信息:
除了属性特性,Object还引入了一个重要的对象初始化生命周期。特别是,创建Object或其派生类的新示例将依次涉及以下生命周期:
init()
方法。在上面的例子中,第2步和第3步都发生在类构造函数的末尾。建议您在
init()
方法中执行对象初始化,因为在该阶段,对象配置已经应用。为了保证上述生命周期,如果Object的子类需要重写构造函数,应该像下面这样做:
也就是说,
$config
参数(默认为[]
)应该声明为构造函数的最后一个参数,并且应该在构造函数的末尾调用父实现。如果你想在
__construct
中使用额外的参数,你可以这样做:你可以在第三个例子的官方文档中找到它。
qqrboqgw2#
使用
__construct()
而不是__contruct
作为配置密钥: