Каждый сталкивается с синтаксическими ошибками. Даже опытные программисты допускают опечатки. Для новичков это просто часть процесса обучения. Тем не менее, часто легко интерпретировать сообщения об ошибках, такие как:
PHP Ошибка разбора: синтаксическая ошибка, неожиданный '{' в index.php на строке 20 Неожиданный символ не всегда является истинным виновником. Но номер строки дает примерное представление о том, с чего начать поиск. Всегда смотрите на контекст кода. Синтаксическая ошибка часто скрывается в упомянутых или в предыдущих строках кода. Сравните свой код с примерами синтаксиса из руководства. Хотя не каждый случай совпадает с другим. Тем не менее, есть некоторые общие шаги по решению синтаксических ошибок. В этой ссылке обобщены распространенные "подводные камни":
- Неожиданный T_STRING
- Unexpected T_VARIABLE
Unexpected '$varname' (T_VARIABLE)- Unexpected T_CONSTANT_ENCAPSED_STRING
Unexpected T_ENCAPSED_AND_WHITESPACE- Неожиданный $end
- Неожиданная T_FUNCTION...
- Unexpected
{
Unexpected}
Unexpected(
Unexpected)
)- Unexpected
[
Unexpected]
- Unexpected T_IF
Unexpected T_FOREACH
Unexpected T_FOR
Unexpected T_WHILE
Unexpected T_DO
Unexpected T_PRINT
Unexpected T_ECHO- Unexpected T_LNUMBER
- Unexpected ?
- Неожиданное продолжение (T_CONTINUE)
Неожиданное продолжение (T_BREAK)
Неожиданное продолжение (T_RETURN)- Unexpected '='
- Неожиданный T_INLINE_HTML...
- Неожиданный T_PAAMAYIM_NEKUDOTAYIM...
- Неожиданный T_OBJECT_OPERATOR...
- Неожиданный T_DOUBLE_ARROW...
- Unexpected T_SL...
- Unexpected T_BOOLEAN_OR...
Unexpected T_BOOLEAN_AND...- Unexpected T_IS_EQUAL
Неожиданный T_IS_GREATER_OR_EQUAL
Неожиданный T_IS_IDENTICAL
Неожиданный T_IS_NOT_EQUAL
Неожиданный T_IS_NOT_IDENTICAL
Неожиданный T_IS_SMALLER_OR_EQUAL
Неожиданное<
Unexpected>
- Неожиданный T_NS_SEPARATOR...
- Unexpected character in input: '
\
' (ASCII=92) state=1- Unexpected 'public' (T_PUBLIC)
Unexpected 'private' (T_PRIVATE)
Unexpected 'protected' (T_PROTECTED)
Unexpected 'final' (T_FINAL)...- Неожиданный T_STATIC...
- Неожиданный T_CLASS...
- Неожиданный T_DNUMBER
- Неожиданные
,
(запятая)- Unpexected
.
(точка)- Неожиданный
;
(точка с запятой)- Неожиданный
*
(звездочка)- Неожиданный
:
(двоеточие) Близкие по смыслу ссылки:- Что означает эта ошибка в PHP? (ошибки времени выполнения)
- Ошибка разбора: синтаксическая ошибка, неожиданный T_XXX
- Ошибка разбора: синтаксическая ошибка, неожиданный T_ENCAPSED_AND_WHITESPACE
- Ошибка разбора: синтаксическая ошибка, неожиданный T_VARIABLE
- Что означает этот символ в PHP? (языковые лексемы)
- Эти
умные
кавычки ничего не значат для PHP И:
- Руководство по PHP на php.net и его различные языковые лексемы
- Или Википедия введение в синтаксис PHP.
- И, наконец, наша php tag-wiki, конечно. Хотя Stack Overflow также приветствует начинающих кодеров, в основном он нацелен на профессиональные вопросы программирования.
- Ответы на ошибки кодирования и узкие опечатки считаются в основном не по теме.
- Поэтому, пожалуйста, потратьте время на выполнение основных шагов, прежде чем публиковать запросы на исправление синтаксиса.
Если вам все еще нужно, пожалуйста, покажите свою собственную инициативу в решении проблемы, попытки исправления и ход ваших мыслей о том, что выглядит или может быть неправильным. Если ваш браузер выдает сообщения об ошибках типа "SyntaxError: illegal character", то это 'не [tag:php]-связано, а [tag:javascript]-синтаксическая ошибка.
Синтаксические ошибки, возникшие в коде поставщика: Наконец, учтите, что если синтаксическая ошибка возникла не при редактировании вашей кодовой базы, а после установки или обновления пакета внешнего поставщика, это может быть связано с несовместимостью версий PHP, поэтому сверьте требования поставщика с настройками вашей платформы.
PHP относится к C-стилю и императивному языкам программирования. Он имеет жесткие правила грамматики, от которых он не может оправиться, когда сталкивается с неправильным расположением символов или идентификаторов. Он не может угадать ваши намерения по кодированию.
Есть несколько основных мер предосторожности, которые вы всегда можете предпринять:
Типичное сообщение об ошибке синтаксиса выглядит следующим образом:
Parse error: syntax error, unexpected T_STRING, expecting '
;
' in file.php on line 217. В котором перечислено возможное местоположение синтаксической ошибки. Смотрите упомянутые имя файла и номер строки. moniker, такой какT_STRING
, объясняет, какой символ синтаксический анализатор/токенизатор не смог окончательно обработать. Однако это не обязательно причина синтаксической ошибки. Важно также просмотреть предыдущие строки кода. Часто синтаксические ошибки - это просто казусы, произошедшие ранее. Номер строки ошибки - это просто место, где синтаксический анализатор окончательно сдался, чтобы обработать все это.Решение синтаксических ошибок
Существует множество подходов к устранению синтаксических ошибок.
;
точки с запятой отсутствуют в конце предыдущей строки/заявления. (По крайней мере, со стилистической точки зрения. ){
блоки кода`` неправильно закрыты или вложены, вам, возможно, придется исследовать еще глубже в исходный код. Используйте правильное отступы кода, чтобы упростить эту задачу.+-*/.
также должны быть окрашены в разные цвета. Иначе они могут оказаться в неправильном контексте."
или '
маркер строки.++
, --
или круглые скобки. Две строки/идентификатора, непосредственно следующие друг за другом, некорректны в большинстве контекстов.if
на отдельные или вложенные условия if
.? :
может уплотнить код и действительно полезен. Но не во всех случаях он способствует читабельности. Предпочитайте простые операторы if
, пока не разбираетесь.if:
/elseif:
/endif;
) является обычным для шаблонов, но, возможно, менее удобен для чтения, чем обычные блоки {
код}
.;
для завершения утверждений/строк."
или '
и неэкранированные кавычки внутри..
.(
скобки)
. Посчитайте их в сообщаемой строке. Одинаковое ли их количество?diff
сломанной и последней рабочей версии. Это может прояснить, в чем проблема с синтаксисом.
grep --color -P -n "\[\x80-\xFF\]" file.php
в качестве первой меры для поиска не-ASCII символов.////
или #
комментариев. Многострочные /*...*/
комментарии редко беспокоят парсер, когда игнорируются переносы строк.php -v
для интерпретатора командной строки<?php php phpinfo();
для интерпретатора, вызываемого через веб-сервер.
Если ваш сайт просто пуст, то, как правило, причиной является синтаксическая ошибка. Включите их отображение с помощью:
error_reporting = E_ALL
.display_errors = 1
.
В вашем php.ini
обычно, или через .htaccess
для mod_php,
или даже .user.ini
при настройке FastCGI.
Включать его в сломанном скрипте слишком поздно, потому что PHP не может интерпретировать/запустить даже первую строку. Быстрым обходным решением является создание скрипта-обертки, скажем test.php
:<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include("./broken-script.php");
Затем вызовите сбойный код, обратившись к этому скрипту-обертке.
Также полезно включить PHP's error_log
и посмотреть в ваш веб-сервер's error.log
, когда скрипт падает с ответами HTTP 500.
Я думаю, что эта тема полностью обсуждена / слишком сложна. Использование IDE - это способ полностью избежать синтаксических ошибок. Я бы даже сказал, что работать без IDE непрофессионально. Почему? Потому что современные IDE проверяют ваш синтаксис после каждого символа, который вы вводите. Когда ваш код и вся ваша строка становятся красными, и большое предупреждение показывает вам точный тип и точное положение синтаксической ошибки, тогда нет абсолютно необходимости искать другое решение.
Вы (эффективно) никогда больше не столкнетесь с синтаксическими ошибками просто потому, что видите их правильно при вводе. Шутки в сторону.
[
В наши дни неожиданная скобка массива [
обычно встречается в устаревших версиях PHP. Синтаксис короткого массива доступен начиная с PHP > = 5.4 . Старые установки поддерживают только array ()
.
$php53 = array(1, 2, 3);
$php54 = [1, 2, 3];
⇑
Отключение результатов функции массива также недоступно для более старых версий PHP:
$result = get_whatever()["key"];
⇑
[Ссылка - что означает эта ошибка в PHP? - «Ошибка синтаксиса, неожиданный« \ `» показывает наиболее распространенные и практические обходные пути.
Тем не менее, вам всегда лучше просто обновить установку PHP. Для общих планов веб-хостинга, первое исследование, если, например,. SetHandler php56-fcgi
можно использовать для включения более нового времени выполнения.
Смотрите также:
Кстати, есть также препроцессоры и информаторы PHP 5.4, если вы действительно цепляетесь за старые + более медленные версии PHP.
Другие причины Неожиданные синтаксические ошибки [
Если это не несоответствие версии PHP, то часто это простая ошибка опечатки или синтаксиса новичка:
Вы не можете использовать объявления / выражения свойств массива в классах, даже в PHP & nbsp; 7.
защищен $ var ["x"] = "Нет" ;
uzo
Смешение [
с открытием фигурных скобок {
или скобок (
является общим упущением.
foreach [$ a как $ b)
uzo
Или даже:
function foobar [$ a, $ b, $ c] {
uzo
Или пытаясь разыменовать константы (до PHP 5.6) как массивы:
$ var = const [123] ;
uzo
По крайней мере, PHP интерпретирует это «const» как постоянное имя.
Если вы хотели получить доступ к переменной массива (что здесь является типичной причиной), добавьте ведущую версию $
sigil - чтобы она стала $ varname
.
Вы пытаетесь использовать ключевое слово global
для члена ассоциативного массива. Это недопустимый синтаксис:
глобальный $ var ['key'] ;
& Лт; br / >
]
закрывающий квадратный кронштейнЭто несколько реже, но есть и синтаксические аварии с завершающим массивом ]
.
Опять не соответствует скобкам )
или }
светлые скобки распространены:
function foobar ($ a, $ b, $ c] {
uzo
Или пытаясь закончить массив, где его нет:
$ var = 2] ;
Что часто встречается в декларациях массивов multi-line и nested .
$ array = [1, [2,3], 4, [5,6 [7, [8], [9,10], 11], 12]], 15] ;
uzo
Если это так, используйте свою IDE для сопоставления скобок, чтобы найти преждевременное закрытие массива ]
. По крайней мере, используйте больше интервалов и новых линий, чтобы сузить его.
Ошибка "unexpected T_VARIABLE
" означает, что имеется буквальное имя $variable
, которое не вписывается в структуру текущего выражения/высказывания.
Чаще всего указывает на пропущенную точку с запятой в предыдущей строке. Назначение переменных после утверждения является хорошим индикатором того, где искать:
⇓
func1()
$var = 1 + 2; # ошибка разбора в строке +2
Частым казусом являются конкатенации строк с забытым оператором .
:
⇓
print "Пришло значение: " $value;
Кстати, вы должны предпочесть интерполяцию строк (базовые переменные в двойных кавычках), если это помогает читабельности. Это позволяет избежать подобных проблем с синтаксисом.
Интерполяция строк - это основная функция языка сценариев. Нет ничего постыдного в ее использовании. Игнорируйте любые советы по микро-оптимизации о том, что конкатенация переменных
.
быстрее. Это не так.
Конечно, такая же проблема может возникнуть и в других выражениях, например, в арифметических операциях:
⇓
print 4 + 7 $var;
PHP не может угадать, должна ли переменная быть сложена, вычтена или сравнена и т.д.
То же самое для синтаксических списков, как в популяциях массивов, где парсер также указывает ожидаемую запятую ,
, например:
⇓
$var = array("1" => $val, $val2, $val3 $val4);
Или списки параметров функций:
⇓
function myfunc($param1, $param2 $param3, $param4)
Эквивалентно вы можете увидеть это в операторах list
или global
, или при отсутствии точки с запятой в цикле for
.
Эта ошибка парсера также встречается в объявлениях классов. Вы можете присваивать только статические константы, но не выражения. Поэтому синтаксический анализатор жалуется на переменные как на присвоенные данные:
class xyz { ⇓
var $value = $_GET["input"];
Несопоставленные }
, закрывающие фигурные скобки, могут, в частности, привести к этому. Если метод завершается слишком рано (используйте правильный отступ!), то блуждающая переменная обычно ошибочно помещается в тело объявления класса.
Также никогда нельзя располагать переменную после идентификатора напрямую:
⇓
$this->myFunc$VAR();
Кстати, это распространенный пример, когда намерение было использовать переменные переменные возможно. В этом случае поиск свойства переменной с помощью $this->{"myFunc$VAR"}();
, например.
Имейте в виду, что использование переменных переменных должно быть исключением. Новички часто пытаются использовать их слишком небрежно, даже когда массивы были бы проще и уместнее.
Поспешный набор текста может привести к забытой открывающей скобке
для операторов if
, for
и foreach
:
⇓
foreach $array as $key) {
Решение: добавьте недостающее открывающее (
между оператором и переменной.
⇓
else ($var >= 0)
Решение: Удалите условия из else
или используйте elseif
.
⇓
function() использует $var {}
Решение: Добавьте скобки вокруг $var
.
Как упоминалось в справочном ответе о "Невидимых пробельных символах Unicode" (таких как неразрывный пробел), вы также можете увидеть эту ошибку для ничего не подозревающего кода, например:
<?php
⇐
$var = new PDO(...);
Это довольно распространено в начале файлов и для скопированного и вставленного кода. Проверьте с помощью hexeditor, если визуально не кажется, что в вашем коде есть проблемы с синтаксисом.
& Лт;!--ToDo: включить https://stackoverflow.com/a/13935532/345031, который лучше охватывает первый общий случай.-- >
Громоздкие имена T_CONSTANT_ENCAPSED_STRING
и T_ENCAPSED_AND_WHITESPACE
относятся к цитируемой " строке"
литералы .
Они используются в разных контекстах, но проблема синтаксиса довольно похожа. T_ENCAPSED ... предупреждения встречаются в контексте строк с двумя кавычками, в то время как T_CONSTANT ... строки часто сбиваются с пути в простых выражениях или утверждениях PHP.
И это чаще всего встречается при неправильной интерполяции переменных PHP:
回 全
echo "Здесь идет $ неправильный ['array'] доступ" ;
Цитирование ключей массивов является обязательным в контексте PHP. Но в двойных кавычках (или HEREDOCs) это ошибка. Анализатор жалуется на содержащуюся в нем одну цитируемую 'string'
, потому что он обычно ожидает там буквальный идентификатор / ключ.
Точнее, допустимо использовать стиль PHP2 простой синтаксис в двойных кавычках для ссылок на массивы:
echo "Это всего лишь $ valid [здесь] ...«;
Однако вложенные массивы или более глубокие ссылки на объекты требуют синтаксиса [сложного кудрявого строкового выражения](http://www.php.net/language.types.string#language.types.string.parsing#complex+curly + syntax):
echo "Используйте {$ array ['as_usual']} с вьющимся синтаксисом.«;
Если вы не уверены, это обычно безопаснее в использовании. Это часто даже считается более читабельным. И лучшие IDE на самом деле используют для этого отличную синтаксическую раскраску.
Если строка следует выражению, но не имеет конкатенации или другого оператора, то вы увидите, что PHP жалуется на строковую строку:
,
распечатать "Привет" . МИР " !«;
Хотя это очевидно для вас и меня, PHP просто не может догадаться , что строка должна была быть добавлена там.
Та же синтаксическая ошибка возникает, когда сводящие разделители строк. Строка, начатая одной цитатой '
или double "
, также заканчивается той же.
,
распечатать "< a href =" ' . $ ссылка . "" > нажмите здесь < / a > ";
⁇
Этот пример начался с двойных кавычек. Но двойные кавычки были также предназначены для атрибутов HTML. Предполагаемый оператор конкатенации внутри, однако, стал интерпретироваться как часть второй строки в одинарных кавычках.
Совет : установите для своего редактора / IDE слегка отличную раскрашивание для строк с одинарной и двойной кавычками. (Это также помогает с логикой приложения, чтобы предпочесть, например,. двойные кавычки для текстового вывода и одиночные кавычки только для постоянных значений.)
Это хороший пример, когда вы не должны вырывать двойные кавычки. Вместо этого просто используйте propert \ "
escapts для HTML атрибуты и # 180; кавычки
распечатать "< a href = \" {$ link} \ "> нажмите здесь < / a >";
Хотя это также может привести к путанице в синтаксисе, все лучшие IDE / редакторы снова помогают, по-разному окрашивая экранированные кавычки.
Эквивалентно забытые открывающие кавычки "
/ `` рецепт для ошибок синтаксического анализатора:
,
make_url (логин, «открытый») ;
Здесь ', '
станет строковым литералом после голого слова, когда очевидно, что login
должен был быть строковым параметром.
Если вы пропустите запятую ,
в блоке создания массива, анализатор увидит две последовательные строки:
массив (
"ключ" = > «значение»
«следующий» = > »....",
);
Обратите внимание, что последняя строка всегда может содержать дополнительную запятую, но пропустить одну промежуточную непростительно. Что трудно обнаружить без подсветки синтаксиса.
То же самое для вызовов функций:
,
myfunc (123, «текст», «и» «больше»)
Распространенным вариантом являются просто забытые строковые терминаторы:
,
mysql_evil ("ВЫБЕРИТЕ * ИЗ вещей" ;
распечатать "'хорошо'";
uzo
Здесь PHP жалуется на двух струнных литералов, непосредственно следующих друг за другом. Но настоящая причина, конечно, в незакрытой предыдущей строке.
Смотрите также
T_STRING
- это немного неправильный термин. Оно не относится к заключенной в кавычки "строке"
. Это означает, что встретился необработанный идентификатор. Это могут быть пустые
слова, остатки CONSTANT
или имен функций, забытые строки без кавычек или любой простой текст.
<?xml
заголовки в PHP скриптах(
Открывающиеся скобки обычно следуют за языковыми конструкциями, такими как if
/foreach
/ for
/ array
/ list
, или запускают арифметическое выражение. Они синтаксически неверны после "strings"
, предыдущего ()
, одинокого $
и в некоторых типичных контекстах декларации.
Более редким явлением для этой ошибки является попытка использовать выражения в качестве параметров функции по умолчанию. Это не поддерживается даже в PHP7:
function header_fallback ($ value, $ expires = time () + 90000) {
Параметры в объявлении функции могут быть только буквальными значениями или постоянными выражениями. В отличие от функций вызова, где вы можете свободно использовать what (1 + something () * 2)
и т. Д.
То же самое для заявлений участников класса, где допускаются только буквальные / постоянные значения, а не выражения:
класс xyz { 回
var $ default = get_config ("xyz_default") ;
Поместите такие вещи в конструктор. Смотрите также Почему атрибуты PHP не позволяют функции?
Еще раз обратите внимание, что PHP 7 допускает только постоянные выражения var $ xy = 1 + 2 +3;
.
Использование JavaScript или синтаксис jQuery не будет работать в PHP по понятным причинам:
& Лт;?php
print $ (документ) .text () ;
Когда это происходит, это обычно указывает на незавершенную предыдущую строку; и буквальные разделы < script >
, просачивающиеся в контекст кода PHP.
И isset ()
, и empty ()
являются встроенными языками, а не функциями. Им необходимо получить доступ к переменной напрямую. Если вы случайно добавите пару скобок слишком много, вы создадите выражение однако:
,
if (isset (($ _GET ["id"]))) {
То же самое относится к любой языковой конструкции, которая требует неявного доступа к имени переменной. Эти встроенные элементы являются частью языковой грамматики, поэтому не допускают дополнительных декоративных скобок.
Функции пользовательского уровня, для которых требуется ссылка на переменную, но вместо этого получают результат выражения passed-lead к ошибкам времени выполнения.
& Лт; br >
)
Вы не можете отклониться запястья последней в вызове функции. PHP ожидает ценность и, таким образом, жалуется на скобки раннего закрытия )
.
,
callfunc (1, 2,);
Конечная запятая разрешена только в конструкциях array ()
или list ()
.
Если вы забыли что-то в арифметическом выражении, то анализатор сдается. Потому что как это должно интерпретировать это:
,
$ var = 2 * (1 +) ;
И если вы забыли даже закрытие )
, то вместо этого вы получите жалобу на неожиданную точку с запятой.
Для забытых префиксов $
в контрольных операторах вы увидите:
↓ 全
foreach ($ array как неправильный) {
PHP здесь иногда говорит вам, что ожидал ::
вместо. Потому что переменная класса :: $ могла бы удовлетворить ожидаемое переменное выражение $..
& Лт; br >
{
Кудрявые скобки {
и }
включают блоки кода. И синтаксические ошибки о них обычно указывают на некоторое вложение incorrec.
if < / code > & Лт; / h3 >
Чаще всего несбалансированный (
и )
являются причиной, если анализатор жалуется на открытие кудрявого {
выходит слишком рано. Простой пример:
,
if (($ x == $ y) & & (2 == правда) {
Подсчитайте свои parens или используйте IDE, которая помогает с этим. Также не пишите код без пробелов. Читаемость имеет значение.
Вы не можете использовать фигурные скобки в выражениях. Если вы путаете скобки и кудрявые, это не будет соответствовать грамматике языка:
,
$ var = 5 * {7 + $ x} ;
Есть несколько исключений для построения идентификатора, таких как локальная переменная области действия $ {references}
.
Это довольно редко. Но вы также можете получить жалобы синтаксического анализатора {
и `} для сложных переменных:
,
распечатать "Hello {$ world [2 {]} !«;
Хотя вероятность неожиданного }
в таких условиях выше.
& Лт; br >
}
При получении «неожиданной ошибки» вы в основном закрыли блок кода слишком рано.
Это может случиться для любого нескончаемого выражения.
И если в последней строке в блоке функции / кода отсутствует завершающая точка ;
semicolon:
function whithin () {
doStuff ()
} ロ
Здесь анализатор не может сказать, возможно ли вы все еще хотели добавить + 25;
к результату функции или чему-то еще.
Иногда вы видите эту ошибку синтаксического анализатора, когда блок кода был }
закрыт слишком рано, или вы забыли открытие{
enre:
function doStuff () {
если (правда) ⁇
распечатать "да" ;
}
} ロ
В приведенном выше фрагменте if
не было отверстия {
фигурная скобка. Таким образом, закрывающее }
одно ниже стало избыточным. И поэтому следующее закрытие }
, которое предназначалось для функции, не было связано с исходным открытием {
фигурной скобой.
Таких ошибок еще сложнее найти без правильного отступа кода. Используйте IDE и сопоставление скобок.
& Лт; br >
{
, ожидая (
Языковые конструкции, для которых требуется заголовок условия / декларации и блок кода, вызовут эту ошибку.
Например, необъявленные функции без списка параметров не допускаются:
,
функция что угодно {
}
И вы также не можете иметь if
без условий.
,
если {
}
Что не имеет смысла, очевидно. То же самое для обычных подозреваемых, для
/ foreach
, while
/ do
и т. Д.
Если у вас есть эта конкретная ошибка, вам обязательно следует поискать несколько примеров вручную.
Неожиданный T_IF
Неожиданный T_ELSEIF
Неожиданный T_ELSE
Неожиданный T_ENDIF
& Лт; / h2 >
Условные блоки управления if
, elseif
и else
следуют простой структуре. Когда вы сталкиваетесь с синтаксической ошибкой, скорее всего, это просто недопустимый блок вложения → с отсутствующим {
кудрявыми скобами }
- или слишком большим.
Несоответствующие брекеты кода являются общими для менее хорошо отформатированного кода, такого как:
if ((!($ opt ["uniQartz5.8"]!= $ this- > check58)) или (пусто ($ _POST ['poree'])) {если
($ true) {echo "halp";} elseif ((!$ z) или% b) {excSmthng (False,5.8)} elseif (False) {
Если ваш код выглядит так, начните заново! В противном случае это нефиксируется ни для вас, ни для кого-либо еще. Нет смысла демонстрировать это в Интернете, чтобы обратиться за помощью.
Вы сможете это исправить, только если сможете визуально следовать вложенной структуре и соотношению if / else условий и их {
code blocks }
. Используйте свою IDE, чтобы увидеть, все ли они в паре.
if (true) {
if (false) {
...
}
elseif ($ what) {
if ($ something2) {
...
}
еще {
...
}
}
еще {
...
}
if (false) {// второе дерево `if`
...
}
еще {
...
}
}
elseif (false) {
...
}
Любой двойной }
}` закроет не только ветку, но и предыдущую структуру условий. Поэтому придерживайтесь одного стиля кодирования; не смешивайте и не подбирайте вложенные деревья if / else.
Помимо последовательности здесь оказывается полезным избегать длительных условий тоже. Используйте временные переменные или функции, чтобы избежать нечитаемых if
-выражений.
Удивительно частая ошибка новичка - попытка использовать в выражении утверждение «если», например, печатное заявление:
,
эхо "< a href = '" . if ($ link == "example.org") {echo ...
Что, конечно, недопустимо.
Вы можете использовать последовательное условие, но остерегайтесь воздействия на читаемость.
эхо "< a href = '" . ($ link ? "http://yes": "http://no") . "< / a >";
В противном случае разбить такие выходные конструкции вверх: используйте несколько if
s и echo
s.
А еще лучше, используйте временные переменные и поместите ваши условия до:
if ($ link) {$ href = "да"; } else {$ href = "нет"; }
echo "< a href = '$ href' > Link < / a >";
Определение функций или методов для таких случаев также часто имеет смысл.
< h3 > Блоки управления не возвращают «результаты» < / h3 >Теперь это встречается реже, но несколько кодеров даже пытаются обработать if
так, как если бы он мог вернуть результат :
$ var = if ($ x == $ y) {"true"} ;
Что структурно идентично использованию if
в конкатенации / выражении строки.
Но структуры управления (if / foreach / while) не имеют "результата" .
Буквенная строка «true» также будет просто пустым утверждением.
Вам придется использовать назначение в блоке кода :
if ($ x == $ y) {$ var = "true"; }
В качестве альтернативы прибегайте к ?:
троичное сравнение.
Вы не можете прикрепить if
в пределах условия:
,
if ($ x == true и (if $ y != false)) { ... }
Что явно избыточно, потому что и
(илиили
) уже позволяет сравнивать цепочки.
Еще раз: каждый блок управления должен быть оператором. Если предыдущая часть кода не заканчивается точкой с запятой, то это гарантированная синтаксическая ошибка:
,
$ var = 1 + 2 + 3
if (true) {...}
Кстати, последняя строка в блоке кода {...}
имеет точку с запятой.
Теперь, вероятно, неправильно обвинять определенный стиль кодирования, поскольку эту ошибку слишком легко игнорировать:
,
если ($ x == 5) ;
{
$ y = 7;
}
еще ←
{
$ x = -1 ;
}
Что происходит чаще, чем вы можете себе представить.
Когда вы завершите выражение if ()
на ;
, оно выполнит пустое утверждение. ;
становится пустым {{{{{{{}}}}}}}
своего собственного!
Блок {...}
, таким образом, отсоединяется от if
и всегда будет работать.
Таким образом, else
больше не имел отношения к открытой if
конструкции,
вот почему это приведет к непредвиденной ошибке синтаксиса T_ELSE.
<br> <br>
Что также объясняет тонкое изменение этой синтаксической ошибки:
if ($ x) {x_is_true (); }; иначе {что-то_else (); } ;
Где ;
после блока кода {...}
окончивает весь if
конструкция, синтаксически разрывая ветку else
.
Синтаксически разрешено опускать фигурные скобки {
... }
для блоков кода в ветвях if
/elseif
/ else
. К сожалению, синтаксический стиль очень распространен среди нерешенных кодеров. (При ложном предположении это было быстрее печатать или читать).
Однако это, скорее всего, приведет к изменению синтаксиса. Рано или поздно дополнительные заявления попадут в филиалы if / else:
если (правда)
$ x = 5;
elseif (ложный)
$ x = 6;
$ y = 7; ←
еще
$ z = 0 ;
Но чтобы на самом деле использовать блоки кода, у вас есть ***, чтобы написать {
... }
их как таковые!
Даже опытные программисты избегают этого синтаксиса без скобок или, по крайней мере,
понять это как исключительное исключение из правила.
Одна вещь, чтобы напомнить себе, конечно, условный порядок.
if ($ a) {...}
еще {...}
elseif ($ b) {...}
↑
Вы можете иметь столько elseif
, сколько хотите, но else
должен идти последним. Вот так.
Как упомянуто выше, вы не можете иметь контрольные операторы в декларации класса:
класс xyz {
if (true) {
функция ($ var) {{{{{{{}}}}}}}
}
Вы либо забыли функцию, либо закрыли одно }
слишком рано в таких случаях.
При смешивании PHP и HTML замыкание }
для if / elseif
должно находиться в одном блоке PHP <?php ?>
как следующий elseif / else
. Это приведет к ошибке, так как закрытие }
для if
должно быть частью elseif
:
& Лт;?php if ($ x) { ?>
HTML
& Лт;?php} ?>
& Лт;?php elseif ($ y) { ?>
HTML
& Лт;?php} ?>
Правильная форма <?php} elseif
:
& Лт;?php if ($ x) { ?>
HTML
& Лт;?php} elseif ($ y) { ?>
HTML
& Лт;?php} ?>
Это более или менее вариация неправильного отступа - предположительно, часто основанная на неправильных намерениях кодирования.
Вы не можете [помешать другие утверждения * между *](https://stackoverflow.com/questions/11218975/parse-error-syntax-error-unexpected-t-else-and-i-dont-know-why) `if `и `elseif` / ` структурные токены:
if (true) {
}
эхо "между"; ←
elseif (false) {
}
> текст <?php ←?
еще {
}
Либо может происходить только в кодовых блоках {...}
, а не между токенами структуры управления.
Это все равно не имеет смысла. Не то чтобы было какое-то «неопределенное» состояние, когда PHP прыгает между ветвями if
и else
.
Вам придется принять решение, где печатные заявления принадлежат / или если их нужно повторить в обеих ветках.
Вы также не можете разделить if / else между различными структурами управления:
foreach ($ array как $ i) {
if ($ i) {...}
}
еще {...}
Между if
и else
нет синтаксического отношения. Лексическая область foreach
заканчивается на }
, поэтому нет смысла продолжать структуру if
.
Если на неожиданный T_ENDIF жалуются, вы используете альтернативный стиль синтаксиса if:
⁇ elseif:
⁇ else:
⁇ endif;
. О чем вы должны подумать дважды.
Обычный ловушка сбивает с толку жутко [аналогично :
colon для ;
semicolon](https://stackoverflow.com/questions/19250411/parse-error-syntax-error-unexpected-t-endif-in- home-content-error-php). (Покрыто в «Семмиколоне слишком рано»)
Поскольку в файлах шаблонов труднее отслеживать отступ, тем больше при использовании альтернативного синтаксиса - вполне вероятно, что ваш endif;
не соответствует if:
.
Использование } endif;
if
-терминатор.
В то время как «неожиданный конец доллара» обычно является ценой забытого закрытия }
curly brace.
Таким образом, это не синтаксическая ошибка, но стоит упомянуть в этом контексте:
,
if ($ x = true) {{{{{{{}}}}}}}
else {do_false (); }
Это не сравнение ==
/===
, а назначение =
. Это довольно тонко и легко приведет некоторых пользователей к беспомощному редактированию целых блоков условий. Сначала следите за непреднамеренными заданиями - когда бы вы ни столкнулись с логической ошибкой / неправильным поведением.
Когда PHP говорит о «неожиданном« $ end »», это означает, что ваш код закончился преждевременно. (Сообщение немного вводит в заблуждение, если принимать буквально. Речь идет не о переменной с именем «$ end», как иногда предполагают новички. Это относится к «концу файла», EOF < / kbd >.)
Причина: Несбалансированный
{
и}
для блоков кода / и объявлений функций или классов.
Это почти всегда о отсутствующей }
светлой скобке, чтобы закрыть предыдущие блоки кода.
Опять же, используйте надлежащий отступ, чтобы избежать таких проблем.
Используйте IDE с соответствием скобок, чтобы узнать, где }
amiss.
В большинстве IDE и текстовых редакторов есть сочетания клавиш
Большинство IDE также подчеркивают совпадающие скобки, скобки и скобки. Что позволяет довольно легко проверить их корреляцию:
И `Неожиданная синтаксис / ошибка parser $ end также может возникнуть для нетермированных выражений или операторов:
$ var = func (1,
?>
EOF < / kbd >Итак, сначала посмотрите на конец сценариев. Конечный ;
часто избыточен для последнего оператора в любом скрипте PHP. Но у тебя должен быть один. Именно потому, что это сужает такие синтаксические проблемы.
Другое распространенное явление появляется со строками HEREDOC или NOWDOC. Конечный маркер игнорируется с ведущими пробелами, вкладками и т. Д.:
print <<< END
Content...
Content....
END;
# ↑ terminator isn't exactly at the line start
Поэтому анализатор предполагает, что строка HEREDOC будет продолжаться до конца файла (отсюда и «Неожиданный конец»). Практически все IDE и редакторы, освещающие синтаксис, сделают это очевидным или предупредят об этом.
Если вы используете \
в строке, это имеет особое значение. Это называется «Escape Character» и обычно говорит анализатору буквально взять следующий символ.
Пример: echo 'Джим сказал \' Привет \ '';
напечатает Джим сказал 'hello'
Если вы избежите заключительной цитаты строки, заключительная цитата будет принята буквально, а не как предполагалось, т.е. как распечатка цитаты как часть строки и не закрывать строку. Это будет отображаться как ошибка анализа обычно после открытия следующей строки или в конце скрипта.
Очень распространенная ошибка при определении путей в Windows: " C: \ xampp \ htdocs \ "
неверно. Вам нужен " C: \\ xampp \\ htdocs \\ "
.
Несколько реже вы можете увидеть эту синтаксическую ошибку при использовании альтернативного синтаксиса для блоков операторов / кодов в шаблонах. Использование if:
и else:
и отсутствующего endif;
например.
Конструкции управления, такие как if
, foreach
, for
, while
, list
, global
, return
, do
, print
, echo
могут использоваться только в качестве операторов. Они обычно проживают на линии сами по себе.
Довольно универсально вы пропустили точку с запятой в предыдущей строке, если анализатор жалуется на контрольное утверждение:
,
$ x = myfunc ()
if (true) {
Решение: посмотрите в предыдущую строку; добавить точку с запятой.
Другое место, где это происходит, - в декларациях классов. В разделе класса вы можете только перечислять инициализации свойств и разделы методов. Там не может находиться ни один код.
класс xyz {
if (true) {{{{{}}}}}
foreach ($ var) {{{{{}}}}}
Такие синтаксические ошибки обычно материализуются для неправильно вложенных {
и }
. В частности, когда блоки кода функции закрылись слишком рано.
Большинство языковых конструкций могут использоваться только в качестве операторов. Они не предназначены для размещения внутри других выражений:
,
$ var = массив (1, 2, foreach ($ else as $ _), 5, 6) ;
Точно так же вы не можете использовать if
в строках, математических выражениях или в другом месте:
,
напечатать "О," . if (true) {"ты!"} . "не будет работать";
// Вместо этого используйте троичное состояние, когда достаточно разбираетесь.
Для включения if
-подобных условий в выражение конкретно, вы часто хотите использовать ?:
Тернарная оценка.& Лт; / sup >
То же самое относится к for
, while
, global
, echo
и менее расширенному list
.
,
эхо 123, эхо 567, "да?«;
Принимая во внимание, что print ()
является встроенным языком, который может использоваться в контексте выражения. (Но редко имеет смысл.)
Вы также не можете использовать do
или if
и другие языковые конструкции для пользовательских функций или имен классов. (Возможно, в PHP7. Но даже тогда это не было бы целесообразно.)
Операторы сравнения, такие как ==
, > =
, ===
,!=
, < >
, !==
и< =
или<
и>
в основном следует использовать только в выражениях, таких как выражения if
. Если анализатор жалуется на них, то это часто означает неправильную разбивку или несоответствующие (``)
parens вокруг них.
В частности, для утверждений if
с несколькими сравнениями вы должны позаботиться о правильном подсчете открывающих и закрывающих скобок:
,
if (($ foo < 7) & & $ bar) > 5 || $ baz < 9) { ... }
↑
Здесь условие if
здесь уже было прекращено )
Как только ваши сравнения становятся достаточно сложными, это часто помогает разделить их на несколько вложенных конструкций if
.
Обычный новичок - питфал пытается объединить isset ()
или empty ()
со сравнениями: ,
,
if (пусто ($ _POST ["var"] == 1)) {
Или даже:
,
if (isset ($ variable !== "значение")) {
Это не имеет смысла для PHP, потому что isset
и empty
- это языковые конструкции, которые принимают только имена переменных. Также не имеет смысла сравнивать результат, потому что выходные данные являются только / уже логическими.
> = < / code > больше или равно = > < / code > оператор массива < / h3 >
Оба оператора выглядят несколько похожими, поэтому они иногда путаются:
,
if ($ var = > 5) { ... }
Вам нужно только помнить, что этот оператор сравнения называется « больше или равно », чтобы понять это правильно.
Смотрите также: https://stackoverflow.com/questions/2551718/if-statement-structure-in-php
Вы также не можете объединить два сравнения, если они относятся к одному и тому же имени переменной:
,
if ($ xyz > 5 и < 100)
PHP не может сделать вывод, что вы хотели снова сравнить начальную переменную. Выражения обычно спариваются в соответствии с приоритет оператора, поэтому к тому времени, когда <
будет видно, будет только логический результат остался от исходной переменной.
Смотрите также: [неожиданный T_IS_SMALLER_OR_EQUAL](https://stackoverflow.com/questions/10148054/how-to-check-if-a-text-box-is-not-empty-and-the-value-is-less- than-500)
Вы не можете сравнить с переменной рядом операторов:
,
$ reult = (5 < $ x < 10) ;
Это должно быть разбито на два сравнения, каждое против $ x
.
На самом деле это скорее случай выражений в черном списке (из-за эквивалентной ассоциативности оператора). Он синтаксически действителен на нескольких языках в стиле C, но PHP также не интерпретирует его как ожидаемую цепочку сравнения.
Операторы больше >
или меньше <
не имеют пользовательского имени токенизатора T_XXX
. И хотя они могут быть неуместны, как и все остальные, вы чаще видите, как анализатор жалуется на них за неверно процитированные строки и пюре HTML:
,
распечатать "< a href = 'z" > Hello < / a > ";
↑
Это равносильно тому, что строку " < a href = 'z"
отравнивают>
до буквальной константы Hello
, а затем еще <
сравнение. Или, по крайней мере, так видит PHP. Фактической причиной и ошибкой синтаксиса была преждевременная строка "
terming.
Также невозможно прикрепить начальные теги PHP:
& Лт;?php echo <?php my_func (); ?>
↑
Смотрите также:
Если вы пытаетесь использовать нулевой оператор объединения ??
в версии PHP до PHP 7 вы получите эту ошибку.
<?= $a ?? 2; // works in PHP 7+
<?= (!empty($a)) ? $a : 2; // All versions of PHP
Аналогичная ошибка может возникнуть для нулевых типов, как в:
function add(?int $sum): ?int {
Что снова указывает на использование устаревшей версии PHP (либо версия CLI php -v
, либо связанный с веб-сервером `phpinfo ();
).
Знак T_LNUMBER
относится к «длинному» / номеру.
В PHP и большинстве других языков программирования переменные не могут начинаться с числа. Первый символ должен быть буквенным или подчеркиванием.
$ 1 // Плохо
$ _1 // Хорошо
*!
Довольно часто подходит для использования preg_replace
-placeholders " $ 1"
в контексте PHP:
# ↓ ↓ ↓
preg_replace ("/ # (\ w +) / e", strtopupper ($ 1))
Где обратный звонок должен был быть процитирован. (Теперь флаг / e
regex устарел. Но иногда он все еще используется неправильно в функциях preg_replace_callback
.)
То же ограничение идентификатора применяется к свойствам объекта, кстати.
↓
$ json- > 0- > значение
Хотя токенизатор / parser не допускает буквальное $ 1
в качестве имени переменной, один может использовать $ {{{1}}}
или $ {"1"}
. Что является синтаксическим обходным путем для нестандартных идентификаторов. (Лучше всего думать об этом как о локальном прицеле. Но обычно: предпочитайте простые массивы для таких случаев!)
Забавно, но очень не рекомендуется, анализатор PHP позволяет Unicode-идентификаторам; так что $ con
будет действительным. (В отличие от буквального 1
).
Неожиданная длина также может возникнуть для объявлений массива - при отсутствии запятых ,
:
# ↓ ↓
$ xy = массив (1 2 3) ;
Или также выполнять вызовы и объявления и другие конструкции:
func (1, 2 3);
функция xy ($ z 2);
для ($ i = 2 3 < $ z)
Поэтому обычно отсутствует один из ;
или,
для разделения списков или выражений.
И снова, неправильно процитированные строки являются частым источником случайных чисел:
# ↓ ↓
echo "< td colspan =" 3 "> что-то плохое < / td >";
К таким случаям следует относиться более или менее как к ошибкам неожиданный T_STRING.
Ни функции, ни классы, ни namespaces не могут быть названы, начиная с числа либо:
↓
функция 123shop () {
Почти так же, как для имен переменных.
Это может быть вызвано наличием недопустимых символов в имени переменной. Имена переменных должны следовать этим правилам:
Имена переменных следуют тем же правилам, что и другие метки в PHP. Действительное имя переменной начинается с буквы или подчеркивания, за которыми следует любое количество букв, цифр или подчеркиваний. В качестве регулярного выражения оно будет выражено следующим образом: «[a-zA-Z \ x7f- \ xff] [a-zA-Z0-9 \ x7f- \ xff] *»
«продолжить» - это утверждение (например, для или если), которое должно выглядеть автономно. Он не может быть использован как часть выражения. Частично потому, что продолжение не возвращает значение, но в выражении каждое подвыражение должно приводить к некоторому значению, поэтому общее выражение приводит к значению. В этом разница между утверждением и выражением.
Это означает, что «продолжение» не может использоваться в троичном выражении или любом операторе, который требует возвращаемого значения.
То же самое касается "перерыва"; конечно. Это также не может использоваться в контексте выражения, но является строгим утверждением (на том же уровне, что и foreach
или if
block).
Теперь это может быть более удивительным для «возврата», но это также просто утверждение уровня блока *. Он возвращает значение (или NULL) в более высокую область / функцию, но не оценивается как само выражение. → То есть: нет смысла делать return (return (false) ;;
Синтаксис использует двоеточие - если двоеточия нет, произойдет вышеуказанная ошибка.
<?php while($query->fetch()): ?>
....
<?php endwhile; ?>
Альтернативой этому синтаксису является использование фигурных скобок:
<?php while($query->fetch()) { ?>
....
<?php } ?>
Сообщение об ошибке, которое начинает Parse error: синтаксическая ошибка, неожиданное ':'
, может быть вызвано ошибочной записью статической ссылки класса Class :: $ Variable
как Class: $ Variable
.