## 對象基類
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
- 錯誤級別配置不生效
- 推進計劃
- 文檔歷史