Solar中所有的__construct()
方法签名是同一的。它们只接收一个参数:一个关联数组。此数组将与配置文件中的参数和类默认配置参数合并。合并后的数组被保存在受保护属性$_config
中,所有继承自Solar_Base的类都会使用到。
PHP代码的大部分类使用一连串的构造器参数;例如,如果你想给构造器传递三条信息,你大概会这样写代码:
<?php
class Normal_Example {
protected $_a = null;
protected $_b = null;
protected $_c = null;
public function __construct($a, $b, $c)
{
$this->_a = $a;
$this->_b = $b;
$this->_c = $c;
}
}
// configure and instantiate a Normal_Example object
$example = new Normal_Example('one', 'two', 'three')
相比之下,Solar类像下面这样构造和实例化:
<?php
class Solar_Example extends Solar_Base {
// the default config array is named for the class with
// an underscore prefix. this lets us collect the parent
// config defaults without them overwriting each other.
protected $_Solar_Example = array(
'a' => null,
'b' => null,
'c' => null,
);
public function __construct($config = null)
{
// let Solar_Base merge the config values from
// the parents, and from the config file
parent::__construct($config);
// use the merged values in $this->_config to
// set our property values
$this->_a = $this->_config['a'];
$this->_b = $this->_config['b'];
$this->_c = $this->_config['c'];
}
}
// configure and instantiate an Solar_Example object
$params = array(
'a' => 'one',
'b' => 'two',
'c' => 'three'
);
$example = Solar::factory('Solar_Example', $params);
为什么要这样做呢?这个想法使得从配置文件读取信息非常简单,并且可以通过延迟加载注册表、工厂方式和其他方式配置对象实例。如果所有类的构造器是一样的,你再也不用记类的构造器参数及参数顺序。