Я просматривал php-src/Zend/zend_API.c
и не мог найти исходный код для функции strlen()
в PHP. Пролистывание базы кода не очень помогло, так как везде было полно lib c strlen
. Гугл тоже не сильно помогает.
Я пытался использовать расширение Vulcan Logi c Dumper для проверки того, что происходит под капотом.
Я попробовал следующее код для проверки:
<?php
strlen("foo"); strpos("foo", "f");
Вот что я получил:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename: /tmp/test.php
function name: (null)
number of ops: 7
compiled vars: none
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
3 0 E > ECHO 3
4 1 INIT_FCALL 'strpos'
2 SEND_VAL 'foo'
3 SEND_VAL 'o'
4 DO_ICALL $0
5 ECHO $0
6 > RETURN 1
Обратите внимание, как strpos()
отображается как вызов функции, но не strlen()
. Поэтому я попробовал это ( это на PHP 7.4, кстати ) в качестве эксперимента и получил кое-что интересное.
Код
<?php
$str = "foo";
echo strlen($str);
echo strpos($str, "o");
Вывод из Vulcan
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename: /tmp/test2.php
function name: (null)
number of ops: 9
compiled vars: !0 = $str
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > ASSIGN !0, 'foo'
4 1 STRLEN ~2 !0
2 ECHO ~2
5 3 INIT_FCALL 'strpos'
4 SEND_VAR !0
5 SEND_VAL 'o'
6 DO_ICALL $3
7 ECHO $3
8 > RETURN 1
Обратите внимание, как внезапно STRLEN
появляется в списке операций, но, как ни странно, strpos()
отображается как INIT_FCALL
. Похоже, что-то в strlen()
отличается от других функций. Я попытался просмотреть руководство, чтобы лучше понять, как работают коды операций , но зашел в тупик, так как там не так много полезной информации.
Может кто-нибудь объяснить, почему strlen()
кажется вести себя так, как другие функции, и, возможно, указать мне исходный код для этого? Возможно, причина, по которой я не могу найти его источник, может быть связана с тем, почему он такой особенный? Я не уверен.