## 对象基类
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.[***]');
~~~
- 欢迎使用 MixPHP
- 安装说明
- 常规安装
- 只安装命令行
- Apache/PHP-FPM安装
- 开发与调试
- 开发注意事项
- 调试与错误
- 基础架构
- 目录结构
- 目录设计
- URL访问
- 命名空间
- 自动加载
- 入口文件
- 框架核心
- Application
- 配置
- 对象
- 组件
- 门面
- 系统服务
- 中间件
- 验证器
- 验证器定义
- 验证规则
- 静态调用
- 模型
- 日志
- 命令行
- 简介
- 命令行开发常识
- 创建命令
- 执行与选项
- 控制台程序
- 守护程序
- HTTP 服务
- 简介
- 服务器
- 路由
- 请求
- 响应
- 控制器
- 视图
- Token
- Session
- Cookie
- 文件上传
- 图片处理
- 分页
- 验证码
- WebSocket 服务
- 简介
- 回调函数
- 消息处理器
- 客户端测试
- nginx代理
- 60s无消息断线
- 多进程
- ProcessPoolTaskExecutor
- 流水线模式
- 推送模式
- 在 Supervisor 中使用
- 协程
- 简介
- 如何开启协程
- HTTP 协程开发
- 命令行协程开发
- 客户端
- MySQL
- PDO
- PDOPersistent
- PDOMasterSlave
- PDOCoroutine
- Redis
- Redis
- RedisPersistent
- RedisCoroutine
- 外部工具库
- 简介
- think-orm
- psr-log
- 安全建议
- 常见问题
- 启动多个 HTTP 服务器
- 连接多个数据库
- 如何设置跨域
- mix-httpd service stop 无效
- No such file or directory
- 错误级别配置不生效
- 推进计划
- 文档历史