【发布时间】:2020-05-24 19:23:05
【问题描述】:
我浏览了php-src/Zend/zend_API.c,但在任何地方都找不到PHP 中strlen() 函数的源代码。浏览代码库并没有真正的帮助,因为它到处都是 libc strlen。谷歌搜索也没有多大帮助。
我尝试使用 Vulcan Logic Dumper 扩展来检查引擎盖下发生了什么。
我尝试了以下代码作为测试:
<?php
strlen("foo"); strpos("foo", "f");
这是我得到的:
寻找切入点 从位置进行分支分析:0 找到 1 个跳转。 (代码 = 62)位置 1 = -2 文件名:/tmp/test.php 函数名:(空) 操作数:7 编译的变量:无 line #* E I O op fetch ext 返回操作数 -------------------------------------------------- ---------------------------------- 3 0 E > 回声 3 4 1 INIT_FCALL 'strpos' 2 SEND_VAL“富” 3 SEND_VAL 'o' 4 DO_ICALL $0 5 回声 $0 6 > 返回 1注意strpos() 如何显示为函数调用,而不是strlen()。所以我尝试了这个(这个在 PHP 7.4 上,顺便说一下)作为一个实验并且得到了一些有趣的东西。
代码
<?php
$str = "foo";
echo strlen($str);
echo strpos($str, "o");
Vulcan 的输出
寻找切入点 从位置进行分支分析:0 找到 1 个跳转。 (代码 = 62)位置 1 = -2 文件名:/tmp/test2.php 函数名:(空) 操作数:9 编译后的变量:!0 = $str line #* E I O op fetch ext 返回操作数 -------------------------------------------------- ---------------------------------- 2 0 E > 分配!0,'foo' 4 1 STRLEN ~2 !0 2 回声 ~2 5 3 INIT_FCALL 'strpos' 4 发送_VAR !0 5 SEND_VAL 'o' 6 DO_ICALL $3 7 回声 $3 8 > 返回 1注意STRLEN 突然出现在操作列表中,但奇怪的是strpos() 显示为INIT_FCALL。 strlen() 似乎与其他功能有所不同。我尝试了looking through the manual to better understand how the opcodes 的工作,但由于没有太多有用的信息而陷入死胡同。
谁能解释为什么strlen() 的行为似乎与其他函数如此不同,并可能指向我的源代码?也许我似乎无法找到它的来源的原因可能与它为什么如此特别有关?我不确定。
【问题讨论】:
-
谢里夫以出色的回复击败了我。 TL;DR:1) PHP
strlen()在内部映射到ZSTR_LEN(),2) 你可以在这里找到 PHPstrpos()的源代码:github.com/php/php-src/blob/master/ext/standard/string.c
标签: php strlen php-internals