Search code examples
phpopcodelanguage-history

When was the STRLEN opcode introduced in PHP?


I was surprised while checking the opcodes generated by a PHP script, that unlike other string functions like str_pad(), strlen() is not a function call like it used to (if I'm not mistaken), but has a dedicated STRLEN opcode:

strlen($c);
str_pad($c, 2);
...

   8     4        STRLEN                                           ~7      !2

...

   9     6        INIT_FCALL                                               'str_pad'
         7        SEND_VAR                                                 !2
         8        SEND_VAL                                                 2
         9        DO_ICALL                                                 

https://3v4l.org/9QJQ7/vld#output

In which PHP version was this opcode introduced? I couldn't find this information anywhere.


Solution

  • The STRLEN opcode was added in PHP 7.0. Here's the commit that introduced it.

    There are a number of other functions which have dedicated opcodes; currently, these functions are:

    • Certain type-checking functions (is_null, is_bool, is_long, is_int, is_integer, is_float, is_double, is_real, is_string, is_array, is_object, is_resource)
    • Certain type-casting functions (intval, floatval, doubleval, strval)
    • defined
    • chr and ord
    • call_user_func and call_user_func_array
    • in_array
    • count (aka sizeof)
    • get_class
    • get_called_class
    • gettype
    • func_get_args and func_num_args
    • array_slice
    • array_key_exists