PHP的strlen与C&S的strlen不一样,是吗?

时间:2015-01-31 21:03:44

标签: php strlen

我试图理解某些事情。在C中,strlen方法执行以下操作 - 它扫描给定的字符串并对其进行计数,直到它变为NULL或0 ASCII字符。

PHP中的

strlen并没有这样做,是吗?

例如,如果我这样做:

$s = "abc\0def";
$ln = strlen($s);

在C中,ln将返回3,但在PHP中它将是7. PHP的strlen如何计算它们?它显然不使用NULL终止符。

2 个答案:

答案 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中的字符串(intchar*),所以不需要查找NUL字节。因此strpos()只返回已知长度而不进行进一步的字符串遍历。

ZEND_FUNCTION(strlen) implementation只返回s->len。它显然必须将该字符串长度转换为另一个zval,以便可以在PHP中再次使用此整数。