簡體   English   中英

PHP 中 strlen() 函數的源代碼在哪里?

[英]Where is the source code for strlen() function in PHP?

我正在瀏覽php-src/Zend/zend_API.c ,但在 PHP 中的任何地方都找不到strlen()函數的源代碼 搜索代碼庫並沒有真正的幫助,因為到處都是 libc strlen 谷歌搜索也沒有太大幫助。

我嘗試使用Vulcan Logic 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如何突然出現在 op 列表中,但奇怪的是strpos()顯示為INIT_FCALL strlen()似乎與其他函數有所不同。 我嘗試通讀手冊以更好地了解操作碼的工作原理,但由於沒有太多有用的信息而陷入了死胡同。


任何人都可以解釋為什么strlen()行為似乎與其他函數如此不同,也許可以將我指向它的源代碼? 也許我似乎找不到它的來源的原因可能與它為什么如此特別有關? 我不知道。

strlen()實際上是 PHP 7 中的操作碼,因此其行為不像典型的函數。 它的源代碼位於php-src/Zend/zend_string.h的第 53 行(截至撰寫本文時),它被定義為宏。

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

它基本上只是讀取_zend_string結構len成員,它將字符串的長度存儲為成員。

如果您查看git-blame,您會看到該特定宏是在 2015 年 PHP 7 發布時添加的。

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

這是我的 git 日志所說的:

commit 4bd22cf1c1d6a262fe2f026e082f2565433c53df
Author: Dmitry Stogov 
Date:   Mon Jun 29 16:44:54 2015 +0300

    Improved zend_string API (Francois Laupretre)

    Squashed commit of the following:

    commit d96eab8d79b75ac83d49d49ae4665f948d15a804
    Author: Francois Laupretre 
    Date:   Fri Jun 26 01:23:31 2015 +0200

        Use the new 'ZSTR' macros in the rest of the code.

        Does not change anything to the generated code (thanks to compat macros) but cleaner.

    commit b3526439104ac7a89a8e0c79dbebf33b22bd01b8
    Author: Francois Laupretre 
    Date:   Thu Jun 25 13:45:06 2015 +0200

        Improve zend_string API

        Add missing methods

所以看起來在 PHP 7 發布前后的某個時間點對 API 進行了一些改進。 目前還不清楚這是否意味着strlen()從一個函數變成了一個操作碼,或者它是否總是一個操作碼。

不過,我確實看到了實習字符串如何影響您實驗中 Vulcan 的輸出。 如果您使用實習字符串,PHP 似乎出於某種原因在執行程序中采用了某種快捷方式。 我不清楚具體如何,但是是的,它的行為似乎與典型功能有些不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM