2014-11-05 3 views
1
$s = 'abc'; 
$s[0] = ''; 
if ($s[0] !== '') { 
    echo 'emmm'; 
} 

Почему $ string [0] = '' не является результатом $ string [0] === ''?

кажется, что $ строки [0] === "\ 0", но более запутанным ..

+3

Что это вы пытаетесь достичь? – wayzz

+0

$ s изначально является строкой, затем вы неявно пытаетесь преобразовать ее в массив с помощью [0], который, вероятно, имеет некоторые странные, непреднамеренные последствия. У вас есть сообщение об ошибке? Вероятно, это предупреждение. Выгрузите значение $ s after, посмотрите, что с ним происходит. – Erik

+3

@ Эрик Нет, это неправильно. См. Http://php.net/manual/de/language.types.string.php#language.types.string.substr – wolfgangwalther

ответ

2

$s[0] дает доступ к одному символу строки. '' не является символом, это строка, поэтому присваивание не выполняется. Вы получаете то же самое поведение, если пытаетесь назначить FALSE на $s[0]. Похоже, PHP делает все возможное, чтобы преобразовать любое значение, которое вы назначили, в один символ. Если вы назначаете непустую строку, она будет использовать первый символ. Если вы присвоите номер, он будет использовать первую цифру. Если вы присвоите значение TRUE, оно будет использовать 1.

+0

Назначение не подлежит. Если вы назначаете '' '', вы ожидаете эффективно удалить символ из строки и в конечном итоге с помощью' bc'. Но вместо этого 'a' заменяется на' \ 0'. Почему это так? – wolfgangwalther

+0

Ваше предположение о том, что назначает символ '' '' символу строки, неверно. Строки хранятся в виде массивов символов, и вы не можете удалить символ из массива, просто назначив ему пустую строку. –

+0

Ну, это просто описывает, что происходит. Мы уже сейчас это. Но вопрос: почему **? – wolfgangwalther

-1

при установке $ s [0] == '', строка изменилась, это «\ 0bc ', и вы знаете, что' \ 'только ускользнул между "", поэтому это "\ 0" не' \ 0 ', а' 'означает \ 0.

+0

Не понимаю. – wolfgangwalther

+0

вы знаете, что 'a' был заменен на '\ 0', так что вы смутили. '' в php просто означает \ 0. – dongyado

+0

Когда я делаю 'var_dump ($ string [0]);' this будет возвращать 'string ' ' (length = 1)'. Когда я делаю 'var_dump ('');' this вернет 'string '' (length = 0)'. – wolfgangwalther

4

The manual ли указать, что происходит:

Запись к из диапазона смещения вкладышей строки с пробелами. Нецелые типы преобразуются в целочисленные. Недопустимый тип смещения испускает E_NOTICE. Отрицательное смещение испускает E_NOTICE в записи, но читает пустую строку. Используется только первый символ назначенной строки. Назначение пустых строк присваивает NULL байт.

(Выделено)

$str[42] = .. обозначения заменяет ровно один байт в строке ровно один байт. Все специальные случаи указаны в руководстве, например, в случае назначения ничего (пустая строка), и в этом случае вместо этого назначается байт NUL.

+1

Я даже процитировал эту часть руководства, но не прочитал эту часть ... стыдно за меня! :) – wolfgangwalther

0

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") { 
+1

Пустая строка и байт ASCII NULL - это две разные вещи. Пустая строка - это строка нулевой длины, которая ничего не содержит. Строка, которая содержит NULL-байт, представляет собой строку длиной 1, которая содержит NULL-байт. – deceze

+0

@deceze: Я разбросал несколько слов вокруг. –

+0

Теперь я также должен критиковать, что байт 'NULL' - это не то же самое, что« null ». PHP «null» является значением PHP типа «null». Байт 'NULL' - это понятие, не зависящее от PHP, это байт со всеми битами, установленными в' 0'. : О) – deceze

Смежные вопросы