php闭包中使用use声明变量的作用域实例分析
本文实例讲述了php闭包中使用use声明变量的作用域。分享给大家供大家参考,具体如下:
如上,闭包中使用use声明的变量来自于生成闭包实例时所在作用域内的同名变量,而不是来自于运行闭包时所在作用域内的同名变量。
而闭包的函数参数则是和正常的函数参数一样来自于运行时所在作用域内的同名变量。
以下为opcode:
Findingentrypoints
Branchanalysisfromposition:0
Jumpfound.Position1=-2
filename: /tmp/testclosure.php
functionname: (null)
numberofops: 20
compiledvars: !0=$c,!1=$i,!2=$c2
line #*EIOop fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E> NOP
11 1 SEND_VAL 123
2 DO_FCALL 1 $0 'getclosure'
3 ASSIGN !0,$0
12 4 ASSIGN !1,456
13 5 INIT_FCALL_BY_NAME !0
6 SEND_VAL 'test'
7 DO_FCALL_BY_NAME 1
14 8 SEND_VAL 3
9 DO_FCALL 1 'sleep'
15 10 SEND_VAL 123
11 DO_FCALL 1 $5 'getclosure'
12 ASSIGN !2,$5
16 13 INIT_FCALL_BY_NAME !2
14 SEND_VAL 'test'
15 DO_FCALL_BY_NAME 1
17 16 INIT_FCALL_BY_NAME !0
17 SEND_VAL 'test'
18 DO_FCALL_BY_NAME 1
29 19 >RETURN 1
Function%00%7Bclosure%7D%2Ftmp%2Ftestclosure.php0x7fb0115f505:
Findingentrypoints
Branchanalysisfromposition:0
Jumpfound.Position1=-2
filename: /tmp/testclosure.php
functionname: {closure}
numberofops: 12
compiledvars: !0=$param,!1=$i
line #*EIOop fetch ext return operands
-------------------------------------------------------------------------------------
5 0 E> RECV !0
1 FETCH_R static $0 'i'
2 ASSIGN !1,$0
6 3 ADD_STRING ~2 '---+param%3A+'
4 ADD_VAR ~2 ~2,!0
5 ADD_STRING ~2 ~2,'+---%0A'
6 ECHO ~2
7 7 ADD_STRING ~3 '---+i%3A+'
8 ADD_VAR ~3 ~3,!1
9 ADD_STRING ~3 ~3,'+---%0A'
10 ECHO ~3
8 11 >RETURN null
Endoffunction%00%7Bclosure%7D%2Ftmp%2Ftestclosure.php0x7fb0115f505
Functiongetclosure:
Findingentrypoints
Branchanalysisfromposition:0
Jumpfound.Position1=-2
filename: /tmp/testclosure.php
functionname: getClosure
numberofops: 9
compiledvars: !0=$i
line #*EIOop fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E> RECV !0
4 1 CONCAT ~0 !0,'-'
2 SEND_VAL 'H%3Ai%3As'
3 DO_FCALL 1 $1 'date'
4 CONCAT ~2 ~0,$1
5 ASSIGN !0,~2
5 6 DECLARE_LAMBDA_FUNCTION '%00%7Bclosure%7D%2Ftmp%2Ftestclosure.php0x7fb0115f5051'
8 7 >RETURN ~4
9 8* >RETURN null
Endoffunctiongetclosure如上,闭包函数的op_array(相当于类定义)在编译期完成,但在运行期生成闭包实例(相当于类实例)时会为不同实例绑定不同的use静态变量(在DECLARE_LAMBDA_FUNCTION中完成)。
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《PHP网络编程技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。