🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 对象基类 MixPHP 的核心类大部分都是继承对象基类,组件全部继承对象基类,了解对象基类有助于我们更加了解框架的运行机制与设计方式。 | 类 | | --- | | mix\base\BaseObject | ## 该类的作用 使配置的使用更加“面向对象”,下面对比一下类库封装。 ThinkPHP: ~~~php 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: ~~~php class Http extends BaseObject { public $baseurl // 当属性导入完成后,会自动执行该方法 public function onInitialize() { // 初始化处理 } } $attributes = [ 'baseurl' => '', ]; $http = new Http($attributes); ~~~ 对比上面两种方式,在配置处理方面显然使用对象基类的方式更好一些。 ## 更多的好处 对象基类使我们可以通过一个配置数组就可动态控制类的全部属性,使得我们可以控制整个框架的运行参数。 ## 通过配置实例化对象 通过阅读“组件”章节,我们了解到:使用频繁的类需定义为组件,那使用不频繁的类该如何处理呢? MixPHP 提供了统一的实例化方法: 在应用配置内的 `libraries` 字段内注册,下面是一个自定义类的注册配置: ~~~php // 类库配置 'libraries' => [ // 普通命名 'myObject' => [ // 类路径 'class' => 'apps\httpd\libraries\Http', // 属性 'baseurl' => 'http://www.baidu.com', ], // 带前缀命名 'prefix.myObject' => [ // 类路径 'class' => 'apps\httpd\libraries\Http', // 属性 'baseurl' => 'http://www.baidu.com', ], // 带多级前缀命名 'prefix.prefix.myObject' => [ // 类路径 'class' => 'apps\httpd\libraries\Http', // 属性 'baseurl' => 'http://www.baidu.com', ], ], ~~~ - prefix.prefix.myObject 是配置名称,实例化时使用。 - class 需要实例化类的命名空间。 - 其他字段:都会在该类实例化后,导入为对象属性,key为属性名称,value为属性的值。 在框架内任何位置都可使用以下方法实例化: ~~~php $http = \apps\httpd\libraries\Http::newInstanceByConfig('libraries.[prefix.prefix.myObject]'); ~~~ [>> 到 GitHub 查看默认类库配置 <<](https://github.com/mix-php/mix/blob/v1/apps/console/config/main.php#L81) ## 对象基类的事件 对象基类包含了三个事件: - onConstruct:构造事件,相当于 __construct 方法。 - onInitialize:当组件完成构造事件并导入配置信息为属性后触发该事件,用于做一些初始化处理。 - onDestruct:析构事件,相当于 __destruct 方法。 使用时只需重写这几个事件方法即可。 ~~~php // 构造事件 public function onConstruct() { parent::onConstruct(); // ... } // 初始化事件 public function onInitialize() { parent::onInitialize(); // ... } // 析构事件 public function onDestruct() { parent::onDestruct(); // ... } ~~~ ## 第三方类库通过配置实例化 `Trait` 如果你想通过配置实例化第三方类库,由于第三方类库肯定是不会继承 `BaseObject` 的,构造、析构、处理配置信息的方式也是不会与 `BaseObject` 一样的,所以只能交由用户自行处理。 用户只需新增一个类,继承第三方类库,实现 `mix\base\StaticInstanceInterface` 接口,并引用 `mix\base\StaticInstanceTrait` 即可。 代码如下: ~~~php class MyLibrary extends ThirdClass implements StaticInstanceInterface { use StaticInstanceTrait; // 如果需要接收配置,可以在这里手动处理,$config 就是传入的配置信息 public function __construct($config = []) { parent::__construct(); } } ~~~ 然后将这个类注册到类库配置 `libraries` 下即可,注册后就可通过配置实例化: ~~~ $object = ThirdClass::newInstanceByConfig('libraries.[***]'); ~~~