of::dispatch($class = null, $action = null, $check = false) 调度入口, 触发of::dispatch事件
-
classstring, null读取调度或设置类名称, null(默认)=读取调度{"class" : 类名, "action" : 方法}, 字符串=("class" | "action")读取调度值
-
actionstring调用的方法名, null(默认)=读取调度, 字符串=设置方法名
-
check加载类返回值校验,false=永不通过,null=永远通过
<?php /** * 如果加载'/demo/ofControllers.php'的返回值通过check, 便new对象后调用index方法 * 返回 index 方法的返回值 */ $result = of::dispatch('demo_ofControllers', 'index', 'allow'); if( is_array($result) ) { echo json_encode($result); //ajax + hmtl 方式开发很有用 } /** * 返回值为{'class': 'demo_ofControllers', 'action' => 'index'} */ of::dispatch(); /** * 修改调度信息 */ of::dispatch('demo_test', 'demo', false);
of::config($name = null, $default = null, $format = 'off') 读取config数据, 返回值,失败返回$default
-
namestring配置名,以'.'分割读取深层数据
-
default默认值,没读到数据时,替换原值做为以后使用
-
actionstring附属动作
0=无任何操作 1=读取到的数据格式化成磁盘路径 2=读取到的数据格式化成网络路径 4=本次使用实时配置读取数据
<?php of::config('_of.xx.cc'); //读取框架变量['xx']['cc']的值
&of::event($key, $event, $params = null) 为类提供回调事件, 触发时返回一个数组包含所有触发返回的数据,管理时返回事件数据,其它无返回值
-
keystring事件类型
-
eventbool, null, asCalltrue=触发事件,false=删除事件,null=管理事件,其它=添加事件(符合回调结构)
-
formatstring添加时=true为特殊结构,删除时=指定删除的回调,触发时=自定义参数[_]键的值,默认null
<?php /** * 框架内部事件说明如下 : * of::halt 代码执行结束后回调 * of::error 自定义异常或错误 * 触发参数 : 对象=异常对象, 数组=指定错误 { * "code" : 错误代码, 默认 E_USER_NOTICE * "info" : 错误描述, 默认 "Unknown error" * "file" : 文件路径, 默认 代码触发文件 * "line" : 错误行数, 默认 代码触发行数 * } * of::dispatch 调度信息变化时调用 * 触发参数 : { * "class" : &调度类名 * "action" : &调度方法 * "check" : &校验参数 * } * of::loadClass 加载新类前调用 应用演示 * 注册参数 : { * "filter" :*匹配的类前缀触发回调 * "router" : 路由模式, 映射前缀,字符串=类前缀替换该字符串(第一个字符不为"/"时会把"_"替换为"/"做为寻类路径) * "asCall" : 回调模式, 函数回调,不能与router共存 * "params" : 回调参数,用[_]键指定触发参数位置 * } * 触发参数 : 回调模式下生效 { * "name" : 类名 * "code" :&代码, 更改执行的代码, null=不更改 * "file" :&路径, 更改代码的路径, null=不更改 * } * of_view::display 加载视图模板前触发 * 触发参数 : { * "tplDir" : &加载的模板路径 * "viewObj" : of_view对象 * } * of_db::rename 重命名指定连接池 * 触发参数 : { * "oName" : 旧名称 * "nName" : 新名称 * } * of_db::before sql语句执行前触发 * 触发参数 : { * "sql" : &sql语句 * "pool" : 连接池键 * } * of_db::after sql语句执行后触发 * 触发参数 : { * "sql" : &sql语句 * "pool" : 连接池键 * "result" : &执行的结果集 * } * of_db::error sql出现错误时回调 * 触发参数 : { * "code" : 错误编码 * "info" : 错误信息 * "note" : 详细日志 * "sql" : &sql语句 * "pool" : 连接池键 * } * of_base_htmlTpl_engine::compile 编译模版引擎前触发 * 触发参数 : { * "tplObj" : &模板的hParse对象 * "tplDir" : 模版的磁盘路径 * } * of_base_error_writeLog::error 发生错误时触发 * 触发参数 : { * "type" : 错误来源, 其中一个(js, php, mysql) * "data" : 错误信息 * } * 回调返回 : * true=接替日志记录, 框架不记录日志 * of_base_com_net::before 请求开始前触发 * 触发参数 : { * "params" :&请求参数 { * "type" : 交互类型(大写字符串)可以是 OPTIONS,GET,HEAD,POST,PUT,DELETE,TRACE * "data" : 报文主体数据(字符串) * "get" : get数据(字符串) * "cookie" : cookie数据(字符串) * "header" : 自定义头信息(字符串) * "timeout" : [连接超时, 响应超时] * "url" : 访问路径(字符串) * 其它调用调用参数 * } * } * of_base_com_net::after 请求结束后触发 * 触发参数 : { * "params" :&请求参数, 同"of_base_com_net::before事件"结构 * "result" :&请求结果, 同"of_base_com_net::request"响应结构 * } */ /** * 事件列表结构如下($event为null时会返回对应事件类型的引用) : { * 事件类型 : { * "change" : 添加删除时会变true * "list" : [{ * "isCall" : true=是回调类型,false=特殊结构 * "event" : 回调事件 * "change" : 新加时会为true * }] * } * } */
of::link($name, $args, $code, $static = true) 注册L类的方法, 在预加载完成后生成
-
namestring方法名, 可以用 &name 来表示返回引用
-
argsstring参数列表, 参考 create_function
-
codestring方法体, 参考 create_function
-
staticbool是否为静态函数, true=静态, false=动态
of::work($code, $info = '', $data = array()) 管理工作流程
参数使用说明
描述 : 管理工作流程, 独立的 时间 队列 错误及事务, 让代码更简洁 工作可以嵌套, 产生任何错误, 事务都会回滚, 避免无意的嵌套, 每个工作都会占用独立数据库连接资源 可以使用 try catch 或 回调方式 开始一个工作 可以获取 当前工作开始时间 与 产生的错误 可以抛出 工作异常 并通过捕获简化代码逻辑 参数 : #开启工作(数组, null) code : 监听数据库连接, 产生问题会自动回滚, 数组=[连接池, ...], null=自动监听 info : 功能参数 int=增加数据监控, 0为当前工作, 1=父层工作..., 指定工作不存在抛出异常 框架回调结构=回调模式创建工作, 不需要 try catch, 回调接收(params)参数 { "result" : &标准结果集 "data" : &标准结果集中的data数据 } 返回 false 时, 回滚工作, 等同 of::work(200, 'Successful', params['data']) 返回 array 时, 赋值data, 等同 params['data'] = array; data : null=启动集成工作, 统一监听子孙工作事务, 启动时自动设置自动监听 #结束工作(布尔) code : 完结事务, true=提交, false=回滚 #抛出异常(数字) code : 问题编码, [400, 600)之间的数字 info : 提示信息 data : 扩展参数, 一个数组 #捕捉异常(对象) code : 异常对象, 通过 try catch 捕获的异常 #获取时间(文本) code : 固定"time" info : 返回时间格式, 默认2=格式化时间, 1=时间戳, 3=[时间戳, 格式化, 时区标识, 格林时差] #操作错误(文本) code : 固定"error" info : 默认true=获取错误, false=清除错误 #全局排除监听(文本) code : 固定"block" info : 排查的监听列表, { "数据库连接池" : true=排除, false=移除 ... } #工作信息(文本) code : 固定"info" info : 获取指定"info"信息, 默认=3(1 | 2), 1=工作ID, 2=监听数据库, 4=注入回调信息 #延迟回调(文本) 在工作事务提交前按队列顺序执行 code : 固定"defer" info : 回调方法接收参数结构 {"wuid" : 工作ID, "isOk" : true=最终提交 false=最终回滚} true = 读取指定标识的回调 false = 删除指定标识的回调 框架回调结构 = 不开启工作直接回调, 若报错将影响当前工作执行结果 {"onWork" : 监听数据库, "asCall" : 框架回调, "params" :o回调参数} = 在新工作中回调 data : 回调唯一标识, 默认=随机标识, 字符串=指定标识 #完成回调(文本) 在工作事务提交后按队列顺序执行 code : 固定"done" info : 回调方法接收参数结构 {"wuid" : 工作ID, "isOk" : true=最终提交 false=最终回滚} true = 读取指定标识的回调 false = 删除指定标识的回调 框架回调结构 = 不开启工作直接回调, 若报错将影响父级工作执行结果 {"onWork" : 监听数据库, "asCall" : 框架回调, "params" :o回调参数} = 在新工作中回调 data : 回调唯一标识, 默认=随机标识, 字符串=指定标识 返回 : #开启工作(数组) 失败抛出异常, 成功 {"code" : 200, "info" : "Successful", "data" : []} #结束工作(布尔) 失败抛出异常 #抛出异常(数字) 抛出工作异常 #捕捉异常(对象) 其它异常继续抛出, 为工作异常返回 { "code" : 异常状态码 "info" : 提示信息 "data" : 问题数据 } #获取时间("time") 返回当前工作的开始时间, 未在工作中抛出异常 #操作错误("error") 未在工作中依然生效, 没错误返回null, 有错误返回 { "code" : 编码, "info" : 错误, "file" : 路径, "line" : 行数, ... } #全局排除监听("block") 排查的监听列表 { "数据库连接池" : true ... } #工作信息("info") 不在工作中返回 null 指定项存在, 返回项信息, 单项返回值, 多项返回数组 { 1"wuid" : 工作ID, 2"list" : [监听连接池, ...], 4"defer" :&{回调ID : 回调信息, ...} 4"done" :&{回调ID : 回调信息, ...} } #延迟回调("defer") #完成回调("done") info为true时, 返回回调信息, 不存在返回null, 不在工作中抛出异常 注明 : 返回的状态码一览表 500 : 发生内部错误(代码报错)
回调用法演示(推荐)
//开始工作, 动态开启SQL事务, $params 结构 {"result" : &接口响应结构, "data" : &标准结果集中的data数据} $result = of::work(null, function ($params) { //$params['result'] 数据 {"code":200,"info":"Successful","data":[]} echo '实参数据: ', json_encode($params['result']), "<br>\n"; //修改结果集数据 $params['data'] = array(1, 2, 3); //生成一个演示错误 trigger_error('产生一个错误'); //无错误返回 null, 否则返回 {"code" : 编码, "info" : 错误, "file" : 路径, "line" : 行数, ...} echo '是否产生错误: ', of::work('error') ? '是' : '否', "<br>\n"; //清除当前工作错误 of::work('error', false); //添加延迟调用到工作结束前(依然在事务中) of::work('defer', array( 'onWork' => array(), 'asCall' => 'var_dump', 'params' => array( "\n<br>执行延迟回调: " ) ), __METHOD__); //添加完成调用到工作结束前(在父级工作中) of::work('done', array( 'onWork' => of::work('info', 'list'), 'asCall' => 'var_dump', 'params' => array( "\n<br>执行完成回调: " ) ), __METHOD__); //不在工作中返回 null, 反之返回 {"list" : [监听连接池, ...]} echo '是否在工作中: ', of::work('info') ? '是' : '否', "<br>\n"; //查询工作时间 echo '工作开始时间: ', of::work('time'), "<br>\n"; echo '工作开始时间戳: ', of::work('time', 1), "<br>\n"; //抛出可捕捉异常 of::work(401, '工作异常不会抛错', array(4, 5, 6)); //返回 false 回滚工作, 不写产生错误时回滚, 返回 array 等同赋值到 $params['data'] return false; }); //打印结果集 {"code"401,"info":"工作异常不会抛错","data":[4,5,6]} echo json_encode($result);
常规用法演示
try { //开始工作, 会启动"default"事务, 返回 {"code" : 200, "info" : "Successful", "data" : []} $result = of::work(array('default')); //演示两种不同异常 of::work(401, '工作异常不会抛错', array(1, 2, 3)); throw new Exception('常规异常会被记录'); //完结工作, true=提交事务, false=回滚事务, 失败会抛出常规异常 of::work(true); } catch (Exception $e) { //捕获异常, 常规异常记录日志, 返回"接口响应结构" $result = of::work($e); } //打印结果级 echo '<br>工作完成结果: '; print_r($result);
&of::slashesDeep(&$data, $func = 'addslashes') 深度加/删反斜杠, 返回 $data 引用
-
datastring, array指定替换的数据
-
funcstringaddslashes=添加反斜线, stripslashes=删除反斜线
&of::arrayReplaceRecursive(&$baseData, &$replace) 深度替换属性, 返回$baseData
-
baseData被替换的数据
-
replace替换的数据
of::callFunc(&$call, $params = null, $return = error) 回调函数, 返回 调用函数 返回的数据
-
callarray, 一般来自监听事件
调用函数的信息有四种写法 : 1. 符合 is_callable 格式的, 如 匿名方法, "class::action" 或 [object, action] 2. 每次调用创建对象的格式, 如 [class, action], 会将会创建class的对象 3. 自定义调用的信息 { "asCall" : 符合上面两种规范 "params" : call_user_func_array 格式的参数,用[_]键指定类名位置,默认最后一位 array( 自定义参数一, 自定义参数二, '_' => null, //params的参数会传到此处 自定义参数三, } 4. 含"."的字符串, 会从of::config中读取对应配置后按上述格式解析, 配合动态配置更灵活
//调用函数 $call = 'action'; //调用静态方法 $call = 'className::action'; //调用动态方法 $call = array(new className, 'action'); //实例化类后调用动态方法 $call = array('className', 'action'); //自定义参数写法 $call = array( 'asCall' => 上述四种写法 'params' => array( 自定义参数一, '_' => null, 自定义参数三 ) ); //实例演示 function action($a = 'a', $b = 'b', $c = 'c') { echo $a, $b, $c; } of::callFunc('action', '-'); //输出: -bc of::callFunc(array( //输出: m-n 'asCall' => 'action', 'params' => array('m', '_' => 0, 'n') //"_"键为"-"参数的位置 ), '-');
-
params一般来自触发事件传入到 [_] 位置的参数
-
return指定无法回调的返回值, 不指定调用失败时报错
of::formatPath($path, $prefix) 格式化路径
-
pathstring指定格式化的路径,'_'开头的去掉'_',其它字符以加上指定前缀,数组则以回调的返回值为值
-
prefixstringpath不以'_'开头字符串的前缀
&of::getArrData($key, &$data = null, $default = null, $extends = 0) 通过字符串获取数组深度数据
-
keystring, arraynull(默认)=返回 data, 字符串=以"."作为分隔符表示数组深度, 数组=以数组的方式代替传参[key, data, default, isEscape]
-
dataarray被查找的数组
-
defaultmixed没查找到的代替值(null)
-
extendsint扩展参数, 使用"|"连接多个功能, 0(默认)=不转义, 1=以"`"作为key的转义字符, 2=默认值赋值到原数据
&of::syntax($code, $exec = false, $tips = false, &$data = null) 校验php语法
-
codestring检查的代码, 符合 eval 的规范
-
execbool是否执行 false=不执行, true=执行, 字符串=执行且指定文件路径
-
tipsbool string是否显示行号源码 false=不显示, true=显示
-
datamixed执行时返回的数据
<?php /** * 语法通过返回 null * 语法失败返回 { * "info" : 错误信息 * "line" : 错误行数 * "tips" : 按 tips 参数显示的代码 * } */ of::syntax('if'); // {"info":"syntax error, unexpected $end, expecting '('","line":1} of::syntax('echo __FILE__;', 'file.php'); // file.php