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で囲まれていた。

コードの方では関数の記述は実行よりも上に記載したが、オペコードでは実行の方が上で関数が下になっている。


ここで一つ気になるのが、関数を書いた位置によってコードの実行速度が変わるか?だ。

というわけで早速試してみたいところだが、速度を計測するためのコードが思いつかないので一旦保留にする。