$s = 'abc';
$s[0] = '';
if ($s[0] !== '') {
echo 'emmm';
}
Почему $ string [0] = '' не является результатом $ string [0] === ''?
кажется, что $ строки [0] === "\ 0", но более запутанным ..
$s = 'abc';
$s[0] = '';
if ($s[0] !== '') {
echo 'emmm';
}
Почему $ string [0] = '' не является результатом $ string [0] === ''?
кажется, что $ строки [0] === "\ 0", но более запутанным ..
$s[0]
дает доступ к одному символу строки. ''
не является символом, это строка, поэтому присваивание не выполняется. Вы получаете то же самое поведение, если пытаетесь назначить FALSE
на $s[0]
. Похоже, PHP делает все возможное, чтобы преобразовать любое значение, которое вы назначили, в один символ. Если вы назначаете непустую строку, она будет использовать первый символ. Если вы присвоите номер, он будет использовать первую цифру. Если вы присвоите значение TRUE
, оно будет использовать 1
.
Назначение не подлежит. Если вы назначаете '' '', вы ожидаете эффективно удалить символ из строки и в конечном итоге с помощью' bc'. Но вместо этого 'a' заменяется на' \ 0'. Почему это так? – wolfgangwalther
Ваше предположение о том, что назначает символ '' '' символу строки, неверно. Строки хранятся в виде массивов символов, и вы не можете удалить символ из массива, просто назначив ему пустую строку. –
Ну, это просто описывает, что происходит. Мы уже сейчас это. Но вопрос: почему **? – wolfgangwalther
при установке $ s [0] == '', строка изменилась, это «\ 0bc ', и вы знаете, что' \ 'только ускользнул между "", поэтому это "\ 0" не' \ 0 ', а' 'означает \ 0.
Не понимаю. – wolfgangwalther
вы знаете, что 'a' был заменен на '\ 0', так что вы смутили. '' в php просто означает \ 0. – dongyado
Когда я делаю 'var_dump ($ string [0]);' this будет возвращать 'string ' ' (length = 1)'. Когда я делаю 'var_dump ('');' this вернет 'string '' (length = 0)'. – wolfgangwalther
The manual ли указать, что происходит:
Запись к из диапазона смещения вкладышей строки с пробелами. Нецелые типы преобразуются в целочисленные. Недопустимый тип смещения испускает
E_NOTICE
. Отрицательное смещение испускаетE_NOTICE
в записи, но читает пустую строку. Используется только первый символ назначенной строки. Назначение пустых строк присваиваетNULL
байт.
(Выделено)
$str[42] = ..
обозначения заменяет ровно один байт в строке ровно один байт. Все специальные случаи указаны в руководстве, например, в случае назначения ничего (пустая строка), и в этом случае вместо этого назначается байт NUL
.
Я даже процитировал эту часть руководства, но не прочитал эту часть ... стыдно за меня! :) – wolfgangwalther
Why $string[0] = '' is not resulting $string[0] === ''?
Потому что в этом случае пустая строка заменяется ASCII кодом NULL-byte
(\0
, ASCII 0
или 0x00
). И когда вы устанавливаете часть строки с пустой строкой, она заменяется на 0x00
.
Если вы хотите сравнить обнуляемые байты, попробуйте это:
if ($s[0] !== chr('0')) {
# or
if ($s[0] !== "\0") {
Пустая строка и байт ASCII NULL - это две разные вещи. Пустая строка - это строка нулевой длины, которая ничего не содержит. Строка, которая содержит NULL-байт, представляет собой строку длиной 1, которая содержит NULL-байт. – deceze
@deceze: Я разбросал несколько слов вокруг. –
Теперь я также должен критиковать, что байт 'NULL' - это не то же самое, что« null ». PHP «null» является значением PHP типа «null». Байт 'NULL' - это понятие, не зависящее от PHP, это байт со всеми битами, установленными в' 0'. : О) – deceze
Что это вы пытаетесь достичь? – wayzz
$ s изначально является строкой, затем вы неявно пытаетесь преобразовать ее в массив с помощью [0], который, вероятно, имеет некоторые странные, непреднамеренные последствия. У вас есть сообщение об ошибке? Вероятно, это предупреждение. Выгрузите значение $ s after, посмотрите, что с ним происходит. – Erik
@ Эрик Нет, это неправильно. См. Http://php.net/manual/de/language.types.string.php#language.types.string.substr – wolfgangwalther