“完成,好過完美。” -- 臉譜書文化之一
##1.19.1 一覽表
變量名稱|是否啟動時自動注冊|是否必須|接口/類|作用說明
---|---|---|---|---
loader|否|是|[PhalApi_Loader](http://www.phalapi.net/docs/classes/PhalApi_Loader.html)|自動加載:負責PEAR風格下類的自動加載,需要手動注冊,指定項目路徑
config|否|是|[PhalApi_Config](http://www.phalapi.net/docs/classes/PhalApi_Config.html)|配置:負責項目配置的讀取,需要手動注冊,指定存儲媒介,默認是[PhalApi_Config_File](http://www.phalapi.net/docs/classes/PhalApi_Config_File.html)
logger|否|是|[PhalApi_Logger](http://www.phalapi.net/docs/classes/PhalApi_Logger.html)|日志紀錄:負責日志的寫入,需要手動注冊,指定日志級別和存儲媒介,默認是[PhalApi_Logger_File](http://www.phalapi.net/docs/classes/PhalApi_Logger_File.html)
request|是|是|[PhalApi_Request](http://www.phalapi.net/docs/classes/PhalApi_Request.html)|接口參數請求:用于收集接口請求的參數
response|是|是|[PhalApi_Response](http://www.phalapi.net/docs/classes/PhalApi_Response.html)|結果響應:用于輸出返回給客戶端的結果,默認為[PhalApi_Response_Json](http://www.phalapi.net/docs/classes/PhalApi_Response_Json.html)
notorm|否|推薦|[PhalApi_DB_NotORM](http://www.phalapi.net/docs/classes/PhalApi_DB_NotORM.html)|數據操作:基于NotORM的DB操作,需要手動注冊,指定數據庫配置
cache|否|推薦|[PhalApi_Cache](http://www.phalapi.net/docs/classes/PhalApi_Cache.html)|緩存:實現緩存讀寫,需要手動注冊,指定緩存
filter|否|推薦|[PhalApi_Filter](http://www.phalapi.net/docs/classes/PhalApi_Filter.html)|攔截器:實現簽名驗證、權限控制等操作
crypt|否|否|[PhalApi_Crypt](http://www.phalapi.net/docs/classes/PhalApi_Crypt.html)|對稱加密:實現對稱加密和解密,需要手動注冊
curl|否|否|[PhalApi_CUrl](http://www.phalapi.net/docs/classes/PhalApi_CUrl.html)|CURL請求類:通過curl實現的快捷方便的接口請求類,需要手動注冊
cookie|否|否|[PhalApi_Cookie](http://www.phalapi.net/docs/classes/PhalApi_Cookie.html)|COOKIE的操作
debug|否|否|boolean|應用級的調試開關,通常可從配置讀取,暫時框架未用到
_formatterArray|否|否|[PhalApi_Request_Formatter_Array](http://www.phalapi.net/docs/classes/PhalApi_Request_Formatter_Array.html)|數組格式化服務(系統內部使用)
_formatterBoolean|否|否|[PhalApi_Request_Formatter_Boolean](http://www.phalapi.net/docs/classes/PhalApi_Request_Formatter_Boolean.html)|布爾值格式化服務(系統內部使用)
_formatterCallable|否|否|[PhalApi_Request_Formatter_Callable](http://www.phalapi.net/docs/classes/PhalApi_Request_Formatter_Callable.html)|回調格式化服務(系統內部使用)
_formatterDate|否|否|[PhalApi_Request_Formatter_Date](http://www.phalapi.net/docs/classes/PhalApi_Request_Formatter_Date.html)|日期格式化服務(系統內部使用)
_formatterEnum|否|否|[PhalApi_Request_Formatter_Enum](http://www.phalapi.net/docs/classes/PhalApi_Request_Formatter_Enum.html)|枚舉格式化服務(系統內部使用)
_formatterFile|否|否|[PhalApi_Request_Formatter_File](http://www.phalapi.net/docs/classes/PhalApi_Request_Formatter_File.html)|上傳文件格式化服務(系統內部使用)
_formatterFloat|否|否|[PhalApi_Request_Formatter_Float](http://www.phalapi.net/docs/classes/PhalApi_Request_Formatter_Float.html)|浮點數格式化服務(系統內部使用)
_formatterInt|否|否|[PhalApi_Request_Formatter_Int](http://www.phalapi.net/docs/classes/PhalApi_Request_Formatter_Int.html)|整數格式化服務(系統內部使用)
_formatterString|否|否|[PhalApi_Request_Formatter_String](http://www.phalapi.net/docs/classes/PhalApi_Request_Formatter_String.html)|字符串格式化服務(系統內部使用)
##1.19.2 DI服務是否已注冊的判斷誤區
###(1)錯誤的判斷方法
當需要判斷一個DI服務是否已被注冊,出于常識會這樣判斷:
```
if (isset(DI()->cache)) {
```
但這樣的判斷永遠為false,不管注冊與否。
追其原因在于,DI類使用了魔法方法的方式來提供類成員屬性,并存放于PhalApi_DI::$data中。
這就導致了如果直接使用isset(DI()->cache)的話,首先不會觸發魔法方法 PhalApi_DI::__get($name)的調用,其次也確實沒有PhalApi_DI::$cache這個成員屬性,最終判斷是否存在時都為false。
簡單來說,以下兩種判斷,永遠都為false:
```
//永遠為false
var_dump(isset(DI()->XXX));
var_dump(!empty(DI()->XXX));
```
###(2)正確判斷的寫法:先獲取,再判斷
正確的用法應該是:
```
//先獲取,再判斷
$XXX = DI()->XXX;
var_dump(isset($XXX));
var_dump(!empty($XXX));
```
這里,可能會對大家帶來一定的困惑,所以在這里特別進行說明。也對框架中這一點不合理的設計深感抱歉。
- 歡迎使用PhalApi!
- 接口,從簡單開始!
- [1.1]-下載與安裝
- [1.2]-創建一個自己的項目
- [1.3]-在線體驗
- [1.4]-文檔、幫助和官網
- [1.10]-對PhalApi框架的抉擇
- [1.11]-快速入門(backup)
- [1.12]-參數規則:接口參數規則配置
- [1.13]-統一的接口請求方式:_sevice=XXX.XXX
- [1.14]-統一的返回格式和結構:ret-data-msg
- [1.15]-數據庫操作:基于NotORM的使用及優化
- [1.16]-配置讀取:內外網環境配置的完美切換
- [1.17]-日記紀錄:簡化版的日記接口
- [1.18]-快速函數:人性化的關懷
- [1.19]-DI服務速查:各資源服務一覽表
- [1.20]-DB操作:數據庫基本操作速查
- [1.21]-類的自動加載:遵循PEAR包的命名規范
- [1.22]-簽名驗證:自定義簽名規則
- [1.23]-請求和響應:GET和POST兩者皆可得及超越JSON格式返回
- [1.24]-緩存策略:更靈活地可配置化的多級緩存
- [1.25]-國際化翻譯:為走向國際化提前做好翻譯準備
- [1.26]-數據安全:數據對稱加密方案
- [1.27]-精益開發:更富表現力的Model層和重量級數據獲取的應對方案
- [1.28]-COOKIE:對COOKIE原生態的支持及記憶加密升級版
- [1.29]-開放與封閉:多入口和統一初始化
- [1.30]-保持的力量:接口開發最佳實踐
- [1.31]-新型計劃任務:以接口形式實現的計劃任務
- [2.11]-核心思想:DI依賴注入-讓資源更可控
- [2.12]-海量數據:可配置的分庫分表
- [2.13]-接口調試:在線SQL語句查看與性能優化
- [2.14]-測試驅動開發:意圖導向編程下的接口開發
- [2.15]-演進:新型計劃任務續篇
- [2.16]-領域驅動設計:應對復雜領域業務的Domain層
- [2.17]-微服務:Api接口服務層
- [2.18]-定制化:資源服務的再實現
- [2.19]-擴展庫:可重用的擴展類庫
- [2.20]-約定編程:架構明顯的編程風格
- [2.21]-服務器統一部署方案簡明版:CentOs---Nginx---php-fpm---MySql-[--Memcached]
- [2.22]-更多工具:精益項目和團隊建設
- [3.1]-擴展類庫:微信開發
- [3.2]-擴展類庫:代理模式下phprpc協議的輕松支持
- [3.3]-擴展類庫:基于PHPMailer的郵件發送
- [3.4]-擴展類庫:優酷開放平臺接口調用
- [3.5]-擴展類庫:七牛云存儲接口調用
- [3.6]-擴展類庫:新型計劃任務
- [3.8]-擴展類庫:用戶、會話和第三方登錄集成
- [3.9]-擴展類庫:swoole支持下的長鏈接和異步任務實現
- [3.11]-擴展類庫:基于FastRoute的快速路由
- [4.2]-開發實戰2:模擬優酷開放平臺接口項目開發
- [4.3]-開發實戰3:一個簡單的小型項目開發(奔跑吧兄弟投票活動)
- [5.1]-架構與思想:PhalApi核心設計和思想解讀
- [5.2]-雜談:扯一些PhalApi的前世和今生
- [5.3]-框架總結:術語表和PHP開發建議
- [5.4]-許可
- [5.5]-聯系和加入我們
- [5.6]-更新日記
- [5.8]-致框架貢獻者:加入PhalApi開源指南
- [6.1]-基于接口查詢語言的SDK包
- [6.2]-SDK包(JAVA版)
- [6.3]-SDK包(PHP版)
- [6.4]-SDK包(Objective-C版)
- [6.5]-SDK包(javascript版)
- [6.6]-SDK包(Ruby版)
- [8.1]-PhalApi視頻教程
- 附錄1:接口文檔參考模板