PHP 规则引擎 Hoa\Ruler
Hoa\Ruler 是匹配特定语法的字符串,Hoa\Ruler\Ruler 定义语言语法描述,Hoa\Ruler\Context 定义变量值,
Hoa\Ruler\Ruler::assert 执行并获得结果,结果是一个布尔值。
TP5 框架代码:
namespace app\index\controller;use Hoa\Ruler\Context; use Hoa\Ruler\Ruler;class Index {public function index(){$ruler = new Ruler();$rule = 'group in ["customer", "guest"] and points > 30';$context = new Context();$context['group'] = 'customer';$context['points'] = function () {return 42;};$r = $ruler->assert($rule, $context);print_r($r);} }
Grammar(语法):
语法 | 说明 |
---|---|
'foo' , "foo" , 'f\'oo'
|
字符串 |
true , false , null
|
预先定义的常量 |
4.2
|
小数 |
42
|
整数 |
['foo', true, 4.2, 42]
|
数组 |
sum(1, 2, 3)
|
调用函数并给定参数 |
points
|
变量 |
points['x']
|
数组指定元素 |
line.pointA
|
访问对象属性 |
line.length()
|
访问对象方法 |
and , or , xor , not
|
逻辑运算符 |
= , != , > , < , >= , <=
|
比较运算符 |
is , in
|
成员操作符 |
Context(对象):
定义规则中变量的值。
1:常量、数字、字符串等标量,或数组、对象等结构化类型。
2:也可以是函数返回的值。
namespace app\index\controller;use Hoa\Ruler\Context; use Hoa\Ruler\Ruler; use Hoa\Ruler\DynamicCallable;class Index {public function index(){$context = new Context();$i = 0;$context['int'] = function () use (&$i) {return ++$i;};var_dump($context['int'],$context['int'],$context['int'],$i);$i = 0;$context['int'] = new DynamicCallable(function () use (&$i) {return ++$i;});var_dump($context['int'],$context['int'],$context['int'],$i);} }>>>int(1) int(1) int(1) int(1) int(1) int(2) int(3) int(3)
Add functions(添加自定义方法):
样例如下:
namespace app\index\controller;class user {const DISCONNECTED = 0;const CONNECTED = 1;protected $_status = 1;public function getStatus(){return $this->_status;} }
namespace app\index\controller;use Hoa\Ruler\Context; use Hoa\Ruler\Ruler; use Hoa\Ruler\DynamicCallable; use Hoa\Ruler\Visitor\Asserter; use app\index\controller\user;class Index {public function index(){$logged = function (user $user) {return $user::CONNECTED === $user->getStatus();};$ruler = new Ruler();$rule = 'logged(user) and points > 30';$context = new Context();$context['user'] = new user();$context['points'] = 42;$asserter = new Asserter();$asserter->setOperator('logged', $logged);$ruler->setAsserter($asserter);//简写:$ruler->getDefaultAsserter()->setOperator('logged', $logged);print_r($ruler->assert($rule, $context));} }>>>1
PHP 规则引擎 Hoa\Ruler相关推荐
- drools规则引擎可视化_Springboot2(60)集成规则引擎Drools
核心pom.xml 文件: <parent> <groupId>org.springframework.boot</groupId> <artifactId& ...
- 详解:Drools规则引擎探究
引入 ▐ 问题引入 天猫奢品业务方为了吸引更多的新客,和提高会员的活跃度,做了一期活动,通过购买天猫奢品频道内的任意商品就赠送特殊积分,积分可以直接兑换限量的奢品商品.假如业务方给的规则如下: 主刃同 ...
- 规则就够用?还是必须上机器学习?46页ppt教你如何把规则引擎和机器学习融会贯通...
来源:专知 本文附PPT,建议阅读5分钟 究竟是用简单有效的规则引擎就够了还是要上机器学习? 标签:机器学习 [ 导读 ]在实际的业务数据生产系统中,我们往往会碰到这样一个困境:究竟是用简单有效的规则 ...
- 几个常见规则引擎的简单介绍和演示
Ilog JRules 是最有名的商用BRMS: Drools 是最活跃的开源规则引擎: Jess 是Clips的java实现,就如JRuby之于Ruby,是AI系的代表: Visual Rules( ...
- 规则引擎 drools_为什么要用规则引擎?
作者:孤独烟来源:https://www.cnblogs.com/rjzheng/p/10996186.html 一天,朱斯参加了一场code Review研讨会.会上的一群人正在讨论着如何对祖传代码 ...
- java风控系统规则引擎_如何设计一套规则引擎系统
很早之前就想写一篇关于「规则引擎」的文章,但是一直苦于没有时间.刚好最近给团队小伙伴梳理了我设计的引擎的使用和原理,正好借此机会在此写下我们的心得. 「规则引擎」系统一般而言,在风控中使用较多,但是经 ...
- 量身定制规则引擎,适应多变业务场景
为什么80%的码农都做不了架构师?>>> 规则引擎适合于做业务规则频繁变化的场景,我们的业务在应用过程中,也经常要处理大量的业务规则,当然,也希望能有一套规则引擎来支撑,这样是 ...
- java 规则引擎_GitHub - javaso/rulegin: 分布式规则引擎系统,重构于开源IOT项目thingboard...
一.背景 规则引擎是一种根据规则中包含的指定条件,判断其能否匹配运行时刻的实时条件来执行规则中所规定的动作, 用户可通过规则引擎设定消息处理规则, 对指定的消息采取相应的措施来对设备进行监控和处理,如 ...
- 从0到1:构建强大且易用的规则引擎
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 张宁 来源 | 公众号「zhisheng」 2 ...
最新文章
- bootstrap-datetimepicker时间控件添加清除按钮
- get_sheet_of_light_result_object_model_3d算子说明
- 课时 21:Kubernetes 存储架构及插件使用(阚俊宝)
- java序列化Serializable
- Oracle中的wmsys.wm_concat
- linux-basic(10)vim程序编辑器
- git 短写设置_如何在短短几分钟内设置一个Git客户端
- php分列显示,【杂谈】PHP数组怎样按键名完成降序分列
- 常用损失函数(Loss Function)
- KMP算法之NEXT数组代码原理分析 - 数据结构和算法38
- 微信html5切水果游戏,H5+JS切水果手机小游戏
- 如何高效率安排你的时间?Mac精品日程管理软件推荐
- 微信小程序 测试环境和正式环境 access_token冲突问题
- 基于opengl编写简单的二维绘图软件
- 八位全加器——python逻辑电路
- 博客园博客排版(js样式实例)
- CHD搭建的环境中,解决用户权限的问题
- js更换自定义鼠标指针图片
- 用Python画一个“中国福”,送给想要祝福的人吧
- 提升产品创新能力,试试斯坦福大学设计思维模型
热门文章
- Linux下/etc/mdev.conf学习
- 数据库,SQL语句的介绍
- 谷歌adsense作弊的方法
- 云智慧智能研究院:2022年智能运维发展八大趋势
- persepolis download manager中文版(pdm下载器)
- 接口测试,利用charles修改app的任意字段
- Fiddler无法抓手机APP数据包的解决办法
- 请问如何修复损坏的jpg文件
- 流量回放repeater的原理分析二:repeater源码分析
- [深度学习]Part1 Python学习进阶Ch24图像处理OpenCV(24.1~24.13)——【DeepBlue学习笔记】