在Yii中创建新对象或者初始化已经存在的对象广泛的使用配置,配置通常包含被创建对象的类名和一组将要赋值给对象的属性的初始值,这里的属性是Yii2的属性。还可以在对象的事件上绑定事件处理器,或者将行为附加到对象上。从而在定义了对象的初始值的同时,充分规定对象的运行时的动态特性。
以下代码中的配置被用来创建并初始化一个数据库连接:
$config = [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=127.0.0.1;dbname=demo',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
];
$db = Yii::createObject($config);
Yii::createObject()是Yii2中最常用的用来创建对象的方法,其内容是从DI Container中去取的对象,在后面的章节中我们会讲到。这个方法方法接受一个配置数组并根据数组中指定的类名创建对象,对象实例化后,剩余的参数被用来初始化对象的属性,事件和行为。
小编提醒:在Yii2.1中,配置数组中用来表示类名的键值由class变成了__class,但是配置的原理是不变的。
对于已存在的对象,可以使用 Yii::configure() 方法根据配置去初始化其属性, 就像这样:
Yii::configure($object, $config);
请注意,如果配置一个已存在的对象,那么配置数组中不应该包含指定类名的 class 元素。
配置是Yii2的一个特色
在编程中,有个非常重要的概念叫“委托”,就是一个对象A可以依靠另一个对象B去完成特定的功能,典型的应用就是策略模式了。要实现“委托”,要有这么个流程:在对象A实例化时注入另一个对象B;A持有对象B;对象A委托对象B去完成特定的功能。“注入”“持有”“委托”都是设计模式中的高频词汇,通过这些操作可以扩展类的功能。
我们看看在别的面向对象语言如Java或者PHP其他框架中经常使用的方式:
class Person{
private $strategy = null;
public function __construct(TravelStrategy $travel){
$this->strategy = $travel;
}
/**
* 设置旅行的方式.
*/
public function setTravelStrategy(TravelStrategy $travel){
$this->strategy = $travel;
}
/**
* 旅行.
*/
public function travel(){
//这里实现了“委托”,委托给$this->strategy来实现旅行的具体方式
return $this->strategy->travelAlgorithm();
}
}
在实例化或者初始化时,大概就是这么用的:
class Test{
public function run($argument){
// 乘坐火车旅行
$person = new Person(new TrainStrategy());
$person->travel();
// 改骑自行车
$person->setTravelStrategy(new BicycleStrategy());
$person->travel();
}
}
Person是一个想要旅行的人,它持有一个具体的交通方式类$strategy,最后旅游