gpt4 book ai didi

php - PHP 中 strlen() 函数的源代码在哪里?

转载 作者:行者123 更新时间:2023-12-05 00:44:26 24 4
gpt4 key购买 nike

我正在浏览 php-src/Zend/zend_API.c 并且找不到 源代码 strlen()在 PHP 中的任何地方运行。搜索代码库并没有真正的帮助,因为它到处都是 libc strlen到处。谷歌搜索也没有太大帮助。

我尝试使用 Vulcan Logic Dumper扩展以检查引擎盖下发生的事情。

我尝试了以下代码作为测试:

<?php

strlen("foo"); strpos("foo", "f");

这是我得到的:
Finding entry pointsBranch analysis from position: 01 jumps found. (Code = 62) Position 1 = -2filename:       /tmp/test.phpfunction name:  (null)number of ops:  7compiled vars:  noneline     #* 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

Notice how strpos() shows up as a function call, but not strlen(). So I tried this (this on PHP 7.4, by the way) as an experiment and got something interesting.

Code

<?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 > ASSIGN !0, 'foo'
4 1 斯特林 ~2 !0
2 echo ~2
5 3 INIT_FCALL 'strpos'
4 SEND_VAR !0
5 SEND_VAL 'o'
6 DO_CALL $3
7 echo $3
8 > 返回 1

突然注意到 STRLEN出现在操作列表中,但奇怪的是 strpos()显示为 INIT_FCALL . strlen() 好像有点不一样比其他功能。我试过 looking through the manual to better understand how the opcodes工作,但由于没有太多有用的信息而陷入死胡同。

谁能解释为什么 strlen()似乎与其他函数的行为如此不同,也许可以将我指向它的源代码?也许我似乎找不到它的来源的原因可能与它为什么如此特别有关?我不知道。

最佳答案

strlen()实际上是 PHP 7 中的操作码,因此其行为不像典型的函数。其源代码位于 php-src/Zend/zend_string.h 在第 53 行(截至撰写本文时),它被定义为宏。

#define ZSTR_LEN(zstr)  (zstr)->len

它基本上只是阅读 len _zend_string struct成员(member),它将字符串的长度存储为成员。

如果你看 git-blame 您会看到在 2015 年 PHP 7 发布时添加了特定的宏。

这是提交: https://github.com/php/php-src/commit/4bd22cf1c1d6a262fe2f026e082f2565433c53df

这是我的 git 日志所说的:

提交 4bd22cf1c1d6a262fe2f026e082f2565433c53df
添加一名作者
日期:2015 年 6 月 29 日星期一 16:44:54 +0300

改进的 zend_string API (Francois Laupretre)

压缩提交以下内容:

提交 d96eab8d79b75ac83d49d49ae4665f948d15a804
添加一名作者
日期:2015 年 6 月 26 日星期五 01:23:31 +0200

在其余代码中使用新的“ZSTR”宏。

不会对生成的代码进行任何更改(感谢 compat 宏)但更干净。

提交 b3526439104ac7a89a8e0c79dbebf33b22bd01b8
添加一名作者
日期:2015 年 6 月 25 日星期四 13:45:06 +0200

改进 zend_string API

添加缺少的方法

所以看起来在 PHP 7 发布前后的某个时候对 API 进行了一些改进。目前尚不清楚这是否意味着 strlen()从一个函数变成了一个操作码,或者如果它总是一个操作码。

不过,我确实看到了实习字符串如何影响您实验中 Vulcan 的输出。如果您使用实习字符串,PHP 似乎出于某种原因在执行程序中采用了某种快捷方式。我不清楚具体如何,但是是的,它的行为似乎与典型功能有些不同。

关于php - PHP 中 strlen() 函数的源代码在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60134074/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com