Сравнение строк PHP без кавычек

Из того, что я знаю о PHP, следующий синтаксис не законен:

if ($s == Yes)

Это должно вместо этого быть записано как:

if ($s == 'Yes')

Однако первый пример работает просто великолепно. Кто-либо знает почему?

7
задан tronman 4 May 2010 в 18:16
поделиться

6 ответов

Обычно он интерпретируется как константа, но если PHP не может найти константу с таким именем, он предполагает, что это строковый литерал, несмотря на отсутствие кавычек. Это сгенерирует сообщение E_NOTICE (которое может быть невидимым, в зависимости от вашего уровня сообщения об ошибках); что-то вроде:

Примечание: использование неопределенной константы Да - предполагается «Да» в script.php в строке 3

В принципе, PHP слишком снисходителен.

13
ответ дан 6 December 2019 в 07:50
поделиться

Короче говоря, PHP действует так, как если бы там были кавычки.

Если PHP не распознает что-либо как зарезервированный токен, он обрабатывает это как строковый литерал.

В журнале ошибок будет отображаться предупреждение об этом.

8
ответ дан 6 December 2019 в 07:50
поделиться

Первый не является строкой.

И это не работает нормально:

error_reporting(E_ALL);
if ($s == Yes) {}

Это наследие тех времен, когда PHP был просто интерпретатором формы «Хорошая домашняя страница», и в настоящее время его сильно обескураживают.

1
ответ дан 6 December 2019 в 07:50
поделиться

В PHP это Yes будет рассматриваться как константа. Если константа не определена, он будет считать, что вы имели в виду строку 'Yes'. Это должно генерировать уведомление, если оно у вас включено.

0
ответ дан 6 December 2019 в 07:50
поделиться

PHP преобразует Yes в «Yes» внутренне, когда константа Yes не подлежит определению.

Кстати .. Если вы хотите сравнить, если $ s имеет значение «Да», а является строкой, тогда вы должны

а) использовать strcmp или б) использовать оператор идентификации "= == "

0
ответ дан 6 December 2019 в 07:50
поделиться

Вам нужно, чтобы и error_reporting показывал уведомления, и display_errors был включен.

error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', '1');

if ($s == Yes) {
  // foo
}
1
ответ дан 6 December 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: