[英]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");
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.