PHPで関数がどのように実行されているか気になるので、下記のコードをVLDで確認してみることにした。
even.php
<?php
function isEven($n){
return ($n % 2 === 0);
}
if(isEven(2)){
echo "even";
}else{
echo "odd";
}
偶数であればtrue(真)を返す簡単な関数だ。
このコードのオペコードを確認してみると、
$ php -d vld.active=1 -d vld.execute=0 /path/to/dir/even.php
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 43) Position 1 = 4, Position 2 = 6
Branch analysis from position: 4
1 jumps found. (Code = 42) Position 1 = 7
Branch analysis from position: 7
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 6
1 jumps found. (Code = 62) Position 1 = -2
filename: /path/to/dir/even.php
function name: (null)
number of ops: 8
compiled vars: none
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
6 0 E > INIT_FCALL 'iseven'
1 SEND_VAL 2
2 DO_FCALL 0 $0
3 > JMPZ $0, ->6
7 4 > ECHO 'even'
5 > JMP ->7
9 6 > ECHO 'odd'
11 7 > > RETURN 1
branch: # 0; line: 6- 6; sop: 0; eop: 3; out0: 4; out1: 6
branch: # 4; line: 7- 7; sop: 4; eop: 5; out0: 7
branch: # 6; line: 9- 11; sop: 6; eop: 6; out0: 7
branch: # 7; line: 11- 11; sop: 7; eop: 7; out0: -2; out1: -2
path #1: 0, 4, 7,
path #2: 0, 6, 7,
Function iseven:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename: /path/to/dir/even.php
function name: isEven
number of ops: 5
compiled vars: !0 = $n
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > RECV !0
3 1 MOD ~1 !0, 2
2 IS_IDENTICAL ~2 ~1, 0
3 > RETURN ~2
4 4* > RETURN null
branch: # 0; line: 2- 4; sop: 0; eop: 4
path #1: 0,
End of function iseven
オペコードが2つ生成されていた。
関数の箇所はFunction iseven:〜End of function isevenで囲まれていた。
コードの方では関数の記述は実行よりも上に記載したが、オペコードでは実行の方が上で関数が下になっている。
ここで一つ気になるのが、関数を書いた位置によってコードの実行速度が変わるか?だ。
というわけで早速試してみたいところだが、速度を計測するためのコードが思いつかないので一旦保留にする。





