Глиф Учебники

Parse error: syntax error, unexpected — что делать

Справочник · PHP · 2 минуты чтения

Parse error — PHP не смог прочитать код: в нём нарушены правила языка. Программа при этом не выполняется вовсе, ни одной строки. Сообщение выглядит так:

Текст
Parse error: syntax error, unexpected token "echo" in /home/ivan/site/index.php on line 3

Читать его надо так: в файле index.php на строке 3 PHP встретил то, чего там быть не должно, — echo. Ищите ошибку на указанной строке и строкой выше: чаще всего ошибка стоит в конце предыдущей строки, а PHP замечает её только на следующем слове.

Частые причины

PHP
<?php
$name = "Анна"
echo $name;

Здесь пропущена ; после "Анна" на строке 2. PHP читает дальше, видит echo на строке 3 и сообщает unexpected token "echo" — «не ждал здесь echo».

Что в сообщенииЧто обычно случилось
unexpected token "echo", unexpected variable "$x", unexpected identifierпропущена ; в конце предыдущей строки
unexpected end of file или Unclosed '{' on line Nне закрыта фигурная скобка { — PHP дошёл до конца файла
unexpected token "}"лишняя закрывающая скобка или пропущена ; перед ней
unexpected token "else"; после if (…) или лишняя } перед else
unexpected token "="у переменной забыт знак $: name = 5 вместо $name = 5
unexpected double-quoted string или unexpected single-quoted stringпропущена точка между строками или кавычка внутри строки не экранирована (перед ней нет \)

Скобки и кавычки

Незакрытая скобка — самая неприятная ошибка: PHP сообщает о ней в конце файла, хотя ошибка может быть в начале. Начиная с PHP 8.0 сообщение подсказывает, где открыта скобка: Unclosed '{' on line 5 — значит, не закрыта скобка, открытая на строке 5.

Помогает редактор кода: в Visual Studio Code и других редакторах парная скобка подсвечивается, когда курсор стоит рядом. Отступы тоже выдают ошибку — если блоки выровнены, лишняя или недостающая } видна сразу.

С кавычками то же: строка, открытая " и не закрытая, «съедает» весь код до следующей кавычки. Кавычку внутри строки экранируют обратной косой чертой: "Он сказал: \"Привет\"", или берут другие кавычки: 'Он сказал: "Привет"'.

Проверка без запуска

Bash
php -l index.php

Команда только проверяет синтаксис файла и ничего не выполняет. Если ошибок нет, она пишет No syntax errors detected in index.php, если есть — то же сообщение Parse error с номером строки. Удобно проверять так файлы перед выкладкой на сервер.

Код для новой версии на старом PHP

Конструкции PHP 8 — match, именованные аргументы f(name: 1), свойства в параметрах конструктора — на PHP 7 дают Parse error, хотя код верный. Если ошибка непонятная, а код взят из свежего учебника, проверьте версию PHP на сервере (справка Как узнать версию PHP).

Если на странице только белый экран

Значит, показ ошибок выключен. Как его включить и почему ini_set в том же файле не поможет именно для Parse error — в справке Как включить вывод ошибок.