Strlen в PHP — это не то же самое, что strlen в C, не так ли?

Я пытаюсь что-то понять. В С, StrLen Метод выполняет следующее — он сканирует заданную строку символов и считает их до тех пор, пока не достигнет значения NULL или 0 ASCII.

StrLen в PHP не делает то же самое, не так ли?

Например, если я сделаю это:

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

В С, ln будет возвращено как 3, но в PHP это будет 7. Как подсчитывает их strlen в PHP? Очевидно, он не использует терминаторы NULL.

1

Решение

Это точно как документация говорит, что это так.

Note:

strlen() returns the number of bytes rather than the number of characters in a string.
3

Другие решения

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;

Так что они в основном как строки в Паскале (int а также char*), поэтому нет необходимости искать байт NUL. strpos() поэтому просто возвращает уже известную длину без дальнейшего обхода строки.

ZEND_FUNCTION(strlen) реализация просто возвращается s->len, Очевидно, он должен превратить эту длину строки в другую zval, так что это целое число может быть использовано в PHP снова.

2

По вопросам рекламы [email protected]