定制自己的PHP语法-在PHP中实现unless

首先 ,插一句题外话: 从我发表第一篇PHP执行原理的文章到现在, 已经快2年了, 我很高兴的看到这俩年里PHP中文圈里 ,越来越多的人开始研究PHP源码, 也有越来越多的人开始从事PHP扩展开发.

关于PHP的执行原理, 我想我BLOG的读者都能脱口而出:

  1. 词法分析, 去掉注释, 空白, 得到TOKEN
  2. 语法分析, 在这个过程中生成Opcode array (op_array)
  3. 解释执行, 执行op_array, 一条一条的解释执行Opline(SWITCH, CALL, GOTO)
    今天有人问我, 说他看到有PHPer在说unless语句, 我很是纳闷, 后来才知道, 原来是一个国外的PHP大牛自己Hack了PHP的源码, 加入了一个unless语句.

很有意思, 今天, 我也就在这里为大家演示, 如何为我们自己的PHP加入unless语句..

如果你是不了解PHP的执行过程, 请先花点时间看看我之前的文章深入理解PHP原理之Opcodes:

我们的目标, 是要实现如下的语法(以php 5.2.11为基础):

`unless` 是 Spring Cache 抽象的一个属性,它用于定义一个 SpEL 表达式,用于决定哪些方法调用的返回值不会被缓存。在使用 Spring Cache 时,可以在 `@Cacheable`、`@CachePut`、`@CacheEvict` 等注解通过 `unless` 属性来配置。 下面是一个示例,使用 `unless` 属性来配置不缓存返回值为负数的方法调用: ```java @Cacheable(cacheNames = "myCache", unless = "#result < 0") public int myMethod(int arg) { // do something return result; } ``` 在上面的示例,`unless` 属性的值是一个 SpEL 表达式,它的含义是如果方法调用的返回值小于 0,则不会将返回值缓存起来。注意,这里使用了 `#result` 变量来引用方法调用的返回值。 除了值为 SpEL 表达式的方式外,`unless` 属性还可以接受一个字符串数组,指定一个或多个 SpEL 表达式的名称。在这种情况下,需要在应用程序的配置文件定义这些 SpEL 表达式。例如: ```java @Cacheable(cacheNames = "myCache", unless = {"#mySpELExpression"}) public int myMethod(int arg) { // do something return result; } ``` 在应用程序的配置文件,需要定义名为 `mySpELExpression` 的 SpEL 表达式,例如: ```properties mySpELExpression= #result < 0 ``` 需要注意的是,`unless` 属性只能用于 `@Cacheable`、`@CachePut`、`@CacheEvict` 等注解,不能用于 `@Caching` 注解。另外,`unless` 属性指定的 SpEL 表达式不会影响方法的返回值,它只会影响缓存的行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值