🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
“完成,好过完美。” -- 脸谱书文化之一 ##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)); ``` 这里,可能会对大家带来一定的困惑,所以在这里特别进行说明。也对框架中这一点不合理的设计深感抱歉。