php 回调函数实现eval,利用Eval函数,简单实现回调机制

有时候,我们很多代码结构很类似,前后都一样,就中间不一样。然而不能直接提取重复的代码为1个公共函数直接调用,不得不写成很多重复代码。

如果用回调方式就能轻松解决问题。但在vb/vba中实现回调要通过一个API函数,十分不方便。

最近研究发现,可以利用Eval函数的特性(可以执行文本表达的代码),简单实现回调机制。

优点:容易理解和使用

缺点:

窗体的函数调用不到;

调用的函数必须是公共的;

传递参数不方便;

不支持sub过程。

附上我研究的几个模型,包括有无参数和返回值等。

1、无参数,无返回值'说明:无参数传递,没返回值'

'参数:funcName,函数表达式(字符串)。要调用的函数名,函数名后一定要加括号'

'示例:funcEvalEasy("funcTestEasy()")'

Public Function funcEvalEasy(funcName As String)

'其他代码过程'

'...'

'回调函数部分'

MsgBox "开始执行函数" & funcName

Eval funcName

End Function

Public Function funcTestEasy()

MsgBox "我是测试函数,用于测试回调"

End Function

该示例是通过funcEvalEasy函数调用其他函数,只需要传递一个函数名进去即可。

2、有参数,无返回值

方法1:在funcName,函数表达式中就直接写参数'说明:有参数传递,没返回值'

'参数:funcName,函数表达式(字符串)。要调用的函数名,函数名后一定要加括号'

'示例:funcEvalPara1("funcTestPara(1)")'

'特点:较为灵活'

Public Function funcEvalPara1(funcName As String)

'其他代码过程'

'...'

'回调函数部分'

MsgBox "开始执行函数" & funcName

Eval funcName

End Function

方法2:在执行回调的函数里面合并一个函数表达式'示例:funcEvalPara2(1,"funcTestPara")  为了方便合成函数表达式,就不加括号'

'特点:有什么参数,一目了然,就是不灵活'

Public Function funcEvalPara2(i As Integer, funcName As String)

'其他代码过程'

'...'

'回调函数部分'

MsgBox "开始执行函数" & funcName

Eval funcName & "(" & i & ")"

End Function

Public Function funcTestPara(i As Integer)

MsgBox "我是测试函数,用于测试回调" & vbCrLf & "你传进来的数字是" & i

End Function

方法3:利用公共变量传递参数(这个可以参考下面的示例,一样道理,这里就不赘述)

3、有返回值

方法1:利用公共变量Public intEvalReturn As Integer '临时变量,用于保存返回值'

'说明:有返回值'

'参数:funcName,函数表达式(字符串)。要调用的函数名,函数名后一定要加括号'

'示例:funcEvalReturn("funcTestReturn(1)")'

Public Function funcEvalReturn(funcName As String) As Integer

'其他代码过程'

'...'

'回调函数部分'

MsgBox "开始执行函数" & funcName

Eval funcName

'获取返回值'

MsgBox "返回结果" & intEvalReturn  '弹窗显示'

funcEvalReturn = intEvalReturn    '返回结果'

End Function

Public Function funcTestReturn(i As Integer)

MsgBox "我是测试函数,用于测试回调" & vbCrLf & "你传进来的数字是" & i & vbCrLf & "将执行计算返回一个值"

'计算'

i = i + 1

'返回'

intEvalReturn = i

End Function

方法2:直接返回,因为eval是有返回值的函数,可以直接返回表达式的结果

其实方法1比较麻烦(主要是为了综合演示一下),用方法2比较好。'说明:有返回值'

'参数:funcName,函数表达式(字符串)。要调用的函数名,函数名后一定要加括号'

'示例:funcEvalReturn("funcTestReturn(1)")'

Public Function funcEvalReturn(funcName As String) As Integer

'其他代码过程'

'...'

'回调函数部分'

MsgBox "开始执行函数" & funcName

Dim strReturn As String

strReturn = Eval(funcName)

'获取返回值'

MsgBox "返回结果" & strReturn  '弹窗显示'

funcEvalReturn = strReturn    '返回结果'

End Function

Public Function funcTestReturn(i As Integer)

MsgBox "我是测试函数,用于测试回调" & vbCrLf & "你传进来的数字是" & i & vbCrLf & "将执行计算返回一个值"

'计算'

i = i + 1

'返回'

intEvalReturn = i

End Function

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值