Я пытаюсь что-то понять. В С, StrLen Метод выполняет следующее — он сканирует заданную строку символов и считает их до тех пор, пока не достигнет значения NULL или 0 ASCII.
StrLen в PHP не делает то же самое, не так ли?
Например, если я сделаю это:
$s = "abc\0def";
$ln = strlen($s);
В С, ln
будет возвращено как 3, но в PHP это будет 7. Как подсчитывает их strlen в PHP? Очевидно, он не использует терминаторы NULL.
Это точно как документация говорит, что это так.
Note:
strlen() returns the number of bytes rather than the number of characters in a string.
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 снова.