Discuz!X3解讀之類引入機制及目錄結構

x3d發表於2014-01-04

例項:

– /source/class/table/table_forum_faq.php
– /source/class/model/model_forum_post.php
– /source/plugin/security/table/table_security_evilpost.php

## 引入公共類import($name, $folder = “, $force = true)

1. 會索引被引入過的類,防止重複引入;
2. import以應用根目錄的source目錄為起點進行查詢,再子一級目錄以$folder定義為起點,$path = DISCUZ_ROOT.`/source/`.$folder;
3. 再對$name進行解析:如果$name中包含”/”,處理掉兩端無效的”/”,取出其中包含的目錄及檔名字首資訊進行最終拼裝,如$name=`model/forum_post`,則拼裝成`model/model_forum_post.php`;
4. 最終引入;
5. 引入結果,引入成功返回true;返回失敗,預設丟擲異常、設定了!$force後返回false

## 建立模型物件 _make_obj($name, $type, $extendable = false, $p = array())

1. 根據$name的首字母是否為#,確定是否要呼叫外掛目錄中的類;$name格式:#外掛標識#類名
2. $type決定類名和檔名的字首,如model,table,最終的類名:model_$name
3. 再呼叫import方式引入類檔案,這個過程會構造一個目錄結構的引數過去;
前面提過,所有後臺程式檔案都是放到根目錄的source下;
除了具體的業務程式碼,其它公用類分兩大類:class、plugin/pluginid/
此處要引入的類就放在 $type 目錄下,再傳上$name名
4. 建立例項
建立例項之前,根據$extendable是否為真,確定是否將其建立為一種可動態擴充套件方法的物件。

## 帶來的可能性

在不修改程式碼的情況下,暫時沒想到


相關文章