我试图理解某些事情。在C中,strlen方法执行以下操作 - 它扫描给定的字符串并对其进行计数,直到它变为NULL或0 ASCII字符。
PHP中的strlen并没有这样做,是吗?
例如,如果我这样做:
$s = "abc\0def";
$ln = strlen($s);
在C中,ln
将返回3,但在PHP中它将是7. PHP的strlen如何计算它们?它显然不使用NULL终止符。
答案 0 :(得分:3)
正如documentation所说的那样。
Note:
strlen() returns the number of bytes rather than the number of characters in a string.
答案 1 :(得分:2)
PHP在内部将字符串存储为字节列表,长度为整数。 PHP中的每个值都表示为"zval":
typedef union _zvalue_value {
long lval; /* long value */
double dval; /* double value */
struct {
char *val;
int len; /* this will always be set for strings */
} str; /* string (always has length) */
HashTable *ht; /* an array */
zend_object_value obj; /* stores an object store handle, and handlers */
} zvalue_value;
所以他们基本上喜欢Pascal中的字符串(int
和char*
),所以不需要查找NUL字节。因此strpos()
只返回已知长度而不进行进一步的字符串遍历。
ZEND_FUNCTION(strlen)
implementation只返回s->len
。它显然必须将该字符串长度转换为另一个zval
,以便可以在PHP中再次使用此整数。