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::config 加载框架最新配置时触发, 如: of::congif(xxx, yyy, 4);
* 触发参数 : {
* "config" :&框架配置
* }
* 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
* }]
* }
* }
*/
<?php
//演示通过'of::loadClass'事件生成一个新的事件
of::event('of::loadClass', array(
'filter' => 'of_base_com_timer',
'asCall' => function ($params) {
//读取源代码
$params['code'] || $params['code'] = file_get_contents(OF_DIR . '/base/com/timer.php');
//定位修改方法
$temp = array(
//定位到getCron方法
strpos($params['code'], 'getCron() {'),
//准备注入的事件
'of::event(__METHOD__, true, array(\'cron\' => &$cron));'
);
//将事件注入到return前的位置
$params['code'] = preg_replace("@^(.{{$temp[0]}}.*?)(return)@s", "\${1}{$temp[1]}}\${2}", $params['code']);
}
));
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