Может ли кто-нибудь сказать мне, что здесь происходит?
<?php // true var_dump('\\ ' === '\ '); // false var_dump('\\\\ ' === '\\ '); // true var_dump('\\\\ ' === '\\\ ');
\
внутри строкового литерала вводит несколько типов escape-последовательностей, \\
– escape-последовательность для литерала "\". Но \
s, которые не разрешают escape-последовательность, также берутся как буква "\".
Поэтому '\\ '
обозначает строку «\», '\\\\ '
обозначает строку «\\», как '\\\ '
. Пытаться:
echo '\\\\ '; -> \\
См. http://php.net/manual/en/language.types.string.php#language.types.string.syntax.single .
В строках с одиночными кавычками никакие escape-последовательности не интерполируются. Обратная косая черта – это только escape-символ, если он сразу предшествует одиночной кавычке или обратную косую черту .
Так:
var_dump('\\ '); // String (2) "\ " var_dump('\ '); // String (2) "\ " // They do match var_dump('\\\\ '); // String (3) "\\ " var_dump('\\ '); // String (2) "\ " // They don't match var_dump('\\\\ '); // String (3) "\\ " var_dump('\\\ '); // String (3) "\\ " // They do match
Это ожидаемое и задокументированное поведение, хотя может быть сложно обернуть вокруг себя.
В первом примере вы сравниваете
"\ " and "\ " which is TRUE
в 2-м
"\\ " and "\ " which is FALSE
в 3-м
"\\ " and "\\ " which is TRUE
Если вы распечатываете свои строки
$s = array('\ ', '\\ ', '\\\ ', '\\\\ '); var_dump($s);
ты получишь
array(4) { [0]=> string(2) "\ " [1]=> string(2) "\ " [2]=> string(3) "\\ " [3]=> string(3) "\\ " }
Все двойные косые черты '\\'
были преобразованы в однократные черты '\'
а sigle-slashes остаются прежними. Экранирование работает одинаково в одиночных и двухцилиндренных строках.