上一章 文档首页 下一章


“完成,好过完美。” -- 脸谱书文化之一

1.19.1 一览表

变量名称 是否启动时自动注册 是否必须 接口/类 作用说明
loader PhalApi_Loader 自动加载:负责PEAR风格下类的自动加载,需要手动注册,指定项目路径
config PhalApi_Config 配置:负责项目配置的读取,需要手动注册,指定存储媒介,默认是PhalApi_Config_File
logger PhalApi_Logger 日记纪录:负责日记的写入,需要手动注册,指定日记级别和存储媒介,默认是PhalApi_Logger_File
request PhalApi_Request 接口参数请求:用于收集接口请求的参数
response PhalApi_Response 结果响应:用于输出返回给客户端的结果,默认为PhalApi_Response_Json
notorm 推荐 PhalApi_DB_NotORM 数据操作:基于NotORM的DB操作,需要手动注册,指定数据库配置
cache 推荐 PhalApi_Cache 缓存:实现缓存读写,需要手动注册,指定缓存
filter 推荐 PhalApi_Filter 拦截器:实现签名验证、权限控制等操作
crypt PhalApi_Crypt 对称加密:实现对称加密和解密,需要手动注册
curl PhalApi_CUrl CURL请求类:通过curl实现的快捷方便的接口请求类,需要手动注册
cookie PhalApi_Cookie COOKIE的操作
tracer PhalApi_Helper_Tracer 内置的全球追踪器,支持自定义节点标识(1.4.0及上以版本支持)
debug boolean 应用级的调试开关,通常可从配置读取,为true时开启调试模式
_formatterArray PhalApi_Request_Formatter_Array 数组格式化服务(系统内部使用)
_formatterBoolean PhalApi_Request_Formatter_Boolean 布尔值格式化服务(系统内部使用)
_formatterCallable PhalApi_Request_Formatter_Callable 回调格式化服务(系统内部使用)
_formatterDate PhalApi_Request_Formatter_Date 日期格式化服务(系统内部使用)
_formatterEnum PhalApi_Request_Formatter_Enum 枚举格式化服务(系统内部使用)
_formatterFile PhalApi_Request_Formatter_File 上传文件格式化服务(系统内部使用)
_formatterFloat PhalApi_Request_Formatter_Float 浮点数格式化服务(系统内部使用)
_formatterInt PhalApi_Request_Formatter_Int 整数格式化服务(系统内部使用)
_formatterString PhalApi_Request_Formatter_String 字符串格式化服务(系统内部使用)

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));

这里,可能会对大家带来一定的困惑,所以在这里特别进行说明。也对框架中这一点不合理的设计深感抱歉。


上一章 文档首页 下一章

还有疑问?欢迎到社区提问!

Fork me on GitHub