对象基类

MixPHP 的核心类大部分都是继承对象基类,组件全部继承对象基类,了解对象基类有助于我们更加了解框架的运行机制与设计方式。

| 类 |
| --- |
| mix\base\BaseObject |

该类的作用

使配置的使用更加“面向对象”,下面对比一下类库封装。

ThinkPHP:

class Http
{

    public $baseurl

    public function __construct()
    {
        Config::load('config');
        $this->url = Config::get('config.baseurl');
        $this->init();
    }

    public function init()
    {
        // 初始化处理
    }

}

$http = new Http();

MixPHP:

class Http extends Object
{

    public $baseurl

    // 当属性导入完成后,会自动执行该方法
    public function onInitialize()
    {
        // 初始化处理
    }

}

$attributes = [
	'baseurl' => '',
];
$http = new Http($attributes);

对比上面两种方式,显然使用对象基类的方式更好一些。

更多的好处

对象基类使我们可以通过一个配置数组就可控制类的运行参数,如果把全部类的配置数组集中在一个文件,就可以控制整个框架的运行参数了,MixPHP 就是这样设计的,那个全部类的配置数组就是应用配置文件。

对象的实例化

通过阅读“组件”章节,我们了解到:使用频繁的类需定义为组件,那使用不频繁的类该如何处理呢?

MixPHP 提供了统一的实例化方法:

在应用配置内的 objects 字段内注册,下面是一个自定义类的注册配置:

// 对象配置
'objects'             => [

    'myObject' => [
        // 类路径
        'class' => 'web\index\component\MyObject',
        // 属性
        'name'  => '小花',
    ],

],
  • myObject 是类名称,实例化时使用。
  • class 需要实例化类的命名空间。
  • 其他字段:都会在该类实例化后,导入为对象属性,key为属性名称,value为属性的值。

在框架内任何位置都可使用以下方法实例化,该方法返回的实例不会常驻内存。

$myObject = \Mix::app()->createObject('myObject');

\Mix::app()->createObject 的使用场景:

  • 分页类:使用不频繁,但使用参数需要统一。
  • 多数据库连接:当需要临时连接另一个数据库时。
  • 多服务器:Console开发时,一个控制器启动一个服务,不同服务需要配置不同的参数,由于服务并不是全局调用的,定义为组件不合适,所以定义为对象。

如果类无需配置参数,比如:模型类,请直接使用 new 实例化,无需使用该方法实例化。

基类的事件

  • onConstruct:构造事件,相当于 __construct 方法。
  • onInitialize:当组件完成构造事件并导入配置信息为属性后触发该事件,用于做一些初始化处理。
  • onDestruct:析构事件,相当于 __destruct 方法。

使用时只需重写这几个事件方法即可。

// 构造事件
public function onConstruct()
{
	parent::onConstruct();
    // ...
}

// 初始化事件
public function onInitialize()
{
	parent::onInitialize();
    // ...
}

// 析构事件
public function onDestruct()
{
	parent::onDestruct();
    // ...
}