A.4. 全局构造函数

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);

为什么要这样做呢?这个想法使得从配置文件读取信息非常简单,并且可以通过延迟加载注册表、工厂方式和其他方式配置对象实例。如果所有类的构造器是一样的,你再也不用记类的构造器参数及参数顺序。