Я был удивлен, когда я запустил следующий код в моем редакторе:
<?php
echo "hello";
echo "world"
?>
Как видите, в коде отсутствует точка с запятой (;), но он все еще работает!
Кто-нибудь знает, как это работает и почему; здесь {0,1}?
Поскольку закрывающий тег подразумевает точку с запятой. Вы можете прочитать больше об этом в руководстве под Разделение инструкции.
И цитата оттуда:
Как и в C или Perl, PHP требует, чтобы инструкции заканчивались точкой с запятой в конце каждого оператора. Закрывающий тег блока кода PHP автоматически подразумевает точку с запятой; вам не нужно использовать точку с запятой в конце последней строки блока PHP. Закрывающий тег для блока будет включать в себя немедленно завершающий символ новой строки, если он есть.
Пример, чтобы доказать это:
1. скрипт с пропущенной точкой с запятой в конце, но с закрывающим тегом:
<?php
echo "1";
echo "2"//^ semicolon missing
?>
выход:
12
2. скрипт с пропущенной точкой с запятой в конце, но без закрывающего тега:
<?php
echo "1";
echo "2"//^ semicolon missing (closing tag missing)
выход:
Ошибка разбора: синтаксическая ошибка, неожиданный конец файла, ожидание ‘,’ или ‘;’ в
Потому что точка с запятой сообщает парсеру, что вы достигли конца этой инструкции. Это позволяет ему знать, что следующий фрагмент текста — это новая инструкция. Однако закрывающий тег говорит о том, что мы в конце всех инструкций, вам больше ничего не нужно анализировать. Поскольку мы ничего не анализируем, нам не нужна точка с запятой в конце инструкции, это подразумевается.
Это потому, что точка с запятой не является символом для завершения оператора.
Это выглядит так, потому что это происходит почти всегда в конце оператора.
Обратите внимание почти всегда… может быть подсказка.
Пытаясь избавиться от асимметрии, мы можем сказать, что это всегда между заявлениями!
Это приводит непосредственно к истинному значению точки с запятой: это не завершает утверждения — это разделяет заявления.
Очевидно, что после последнего заявления отделять нечего.
(Большинство языков в любом случае допускают точку с запятой в конце блока, чтобы предотвратить связанные тривиальные ошибки. Это можно сделать, отбросив точку с запятой или, более явно, вставив команду, которая ничего не делает после точки с запятой.)