PHP parse/syntax errors; Ошибки Unexpected XXX и как решить их
Часто программисты допускают ошибки. Могут возникать ошибки синтаксиса. Например:
PHP Parse error: syntax error, unexpected '{' in index.php on line 20
Неожиданный символ не всегда является настоящим виновником. Но номер строки дает приблизительное представление о том, с чего начать поиск.
Всегда смотрите на контекст кода. Синтаксическая ошибка часто кроется в упомянутых или в предыдущих строках кода. Сравните свой код с примерами синтаксиса из руководства.
Дополнительные ссылки для поиска ошибок:
- Как и какими средствами находить ошибки в PHP коде?
- Что означает эта ошибка? (parse, syntax, warning, fatal)
В ответах ниже обобщены распространенные ошибки, найдите ошибку в списке ниже и перейдите к ответу с её описанием.
В работе...
Unexpected T_IS_EQUAL
Unexpected T_IS_GREATER_OR_EQUAL
Unexpected T_IS_IDENTICAL
Unexpected T_IS_NOT_EQUAL
Unexpected T_IS_NOT_IDENTICAL
Unexpected T_IS_SMALLER_OR_EQUAL
Unexpected<
Unexpected>Unexpected character in input: '
\' (ASCII=92) state=1Unexpected 'public' (T_PUBLIC)
Unexpected 'private' (T_PRIVATE)
Unexpected 'protected' (T_PROTECTED)
Unexpected 'final' (T_FINAL)Unexpected T_STATIC
Unexpected T_CLASS
Unexpected 'use' (T_USE)
Unexpected T_DNUMBER
Unexpected
,
Unpexected.
Unexpected;
Unexpected*
Unexpected:
Unexpected ':', expecting ',' or ')'
Unexpected&
Unexpected.
Ответы (10 шт):
Общее о синтаксических ошибках
### Заметка:
Если ваш браузер отображает сообщения об ошибках, такие как "SyntaxError: illegal character", то это на самом деле связано не с PHP, а с Javascript и синтаксическими ошибками в нём
Синтаксические ошибки, возникающие в коде vendor: если синтаксическая ошибка возникла после установки или обновления пакета vendor'а - это может быть связано с несовместимостью версии PHP, поэтому проверьте версию vendor'а. и требования к настройке вашей платформы.
Используйте IDE, например PHPStorm, который всегда подскажет, что с кодом что-то не так. Обращайте внимание на подсказки:
Иногда возникают ошибки из-за лишних символов в начале файла, в частности BOM. Убедитесь, что файл сохранён в UTF-8 без BOM. (если нужен именно utf8)
Если ваш веб-сайт просто пустой с белым экраном, то, как правило, причиной является синтаксическая ошибка. Включите их отображение с помощью этой инструкции
### Как интерпретировать ошибки парсера
Типичное сообщение об ошибке синтаксиса:
Parse error: syntax error, unexpected T_STRING, expecting '
;' in file.php on line 217
(Ошибка синтаксического анализа: синтаксическая ошибка, неожиданный T_STRING, ожидалось ';' в файле file.php в строке 217)
Тут указано возможное место синтаксической ошибки. См. упомянутые имя файла и номер строки.
Токен, такой как T_STRING, объясняет, какой символ синтаксический анализатор/токенизатор не смог окончательно обработать. Однако это не обязательно является причиной синтаксической ошибки. Поэтому важно изучить предыдущие строки кода. Часто синтаксические ошибки - это ошибки, произошедшие ранее. Номер строки ошибки - это именно то место, где синтаксический анализатор окончательно отказался от обработки всего этого, а не точная линия ошибки
Unexpected T_STRING
Unexpected identifier "xxx"
Означает, что был обнаружен необработанный идентификатор. Это может быть разное: от "голых слов" до оставшихся констант или имен функций, забытых строк без кавычек или любого простого текста. Примерные проблемы:
Строки с неверными кавычками
Любая неэкранированная и случайная кавычка
"или'образует недопустимое выражение.⇓ ⇓ echo "<a href="http://example.com">click here</a>";В данном примере используются двойные кавычки в двойных. Это неверно. Интерпретатор "увидит" строку
"<a href="и строку">click here</a>"(т.к. строки заключаются в кавычки), а что такоеhttp://example.comон не поймёт. Важно не забывать использовать обратный слэш для экранирования\"двойных кавычек или\'одинарных кавычек - в зависимости от того, что использовалось снаружи для всей строки (для ознакомления со строками). Например если снаружи двойные кавычки, то внутри проще использовать одинарные, чтобы не запутаться, либо экранировать двойную. С одинарными аналогично. Ещё проще большой текст помещать в HEREDOC или NOWDOCНезакрытые строки
Если вы пропустите закрывающую кавычку, то синтаксическая ошибка обычно возникает позже.
⇓ тут не закрыли и поэтому интерпретатор считает, что строка идёт дальше echo "Some text", $a_variable, "and some runaway string ; success("finished"); ⇯ и тут закрылась..... а что такое `finished");` он не знаетКавычки, не связанные с программированием
Обычно возникают, когда копируют текст из книги. Они могут выглядеть так:
$text = ’Something something..’ + ”these ain't quotes”; ^--- ^-- ^--- ^---Отсутствует точка с запятой
⇓ func1() function2();Невидимые символы Unicode
Если вы получили жалобу парсера T_STRING на совершенно не вызывающий подозрений код, например:
<?php print 123;Нужно взять другой текстовый редактор. Или даже hexeditor. То, что здесь выглядит как простые пробелы и символы новой строки, может содержать невидимые константы. Такое бывает в документах с кодировкой
UTF-8 BOMи нужно сделать кодировкуUTF-8 без BOMЗаэкранированная кавычка
Символ
\имеет особое значение. Часто символ\применяют для экранирования в строках. Чтобы кавычка внутри строки, которая обёрнута в такие же кавычки, печаталась как есть, то её экранируют. Т.е. строкаecho "Jim said \"Hello\"";выведетJim said "hello". Если применить последовательность\", то она будет расценена как попытка экранирования кавычки. Поэтому строка ниже, выдаст ошибку"C:\xampp\htdocs\"правильно будет экранировать обратные слэши тоже:
"C:\\xampp\\htdocs\\"
Unexpected T_VARIABLE
Unexpected '$varname' (T_VARIABLE)
Означает, что есть конкретная переменная с указаннымв ошибке именем, которая не вписывается в текущую структуру выражения/инструкции.
Ошибки:
Отсутствует точка с запятой
Как правило пропущена точка с запятой, а на следующей строке идёт переменная:
⇓ func1() $var = 1 + 2; # parse error in line +2Неверная конкатенация строк
⇓ Пропущен знак конкатенации echo "Here comes the value: " $value;Пропущен оператор выражения
⇓ echo 4 + 7 $var;В перечислениях в массивах или функциях
⇓ $var = array("1" => $val, $val2, $val3 $val4); ⇓ function myfunc($param1, $param2 $param3, $param4)В объявлении свойств классов
В свойства можно назначать только статические значения (которые однозначно определены), но не выражения.
class xyz { ⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓ - это выражение, а не статическое значение. Непозволительно public $value = $_GET["input"];Если необходимо присвоивать переменной выражение, то это нужно делать либо в конструкторе, либо в другом каком-либо инициализирующем методе
Переменные сразу после идентификаторов
⇓ $this->myFunc$VAR();Отсутствие скобок до/после языковых конструкций if, for, foreach
⇓ foreach $array as $key) { ⇓ if ($var = pdo_query($sql) { $result = …Else не ожидает условий
⇓ else ($var >= 0)тут надо либо фигурные скобки, либо применять
elseif(если не нарушает логики)Необходимы скобки для замыканий (closure)
⇓ function() use $var {}Переменные, которые передаются в замыкания всегда надо оборачивать в круглые скобки
Невидимые пробелы
Как отмечалось ранее. Могут быть невидимые символы. Проверьте на их наличие (читайте выше ошибки Unexpected T_STRING)
Unexpected T_CONSTANT_ENCAPSED_STRING
Unexpected T_ENCAPSED_AND_WHITESPACE
Предупреждения T_ENCAPSED… появляются в контексте строки с двойными кавычками, в то время как строки T_CONSTANT… часто возникают в простых выражениях или операторах PHP.
Ошибки:
Неправильная интерполяция переменных
echo "Here comes a $wrong['array'] access";Ключи массива должны быть в кавычках. Но в строках с двойными кавычками (или HEREDOC) это не так. Парсер жалуется на содержащуюся в одинарных кавычках строку.
Можно использовать PHP2-style для написания ключей мамссивов внутри строки
echo "This is only $valid[here] ...";Но лучше изучить фигурный синтаксис и использовать его. Он позволяет писать ключи массива как обычно:
echo "Use {$array['as_usual']} with curly syntax.";Отсутствует конкатенация
⇓ echo "Hello " . WORLD " !";Отсутствует начальная кавычка
⇓ make_url(login', 'open');Пропущена запятая в массиве
array( ⇓ "key" => "value" "next" => "....", );Пропущена запятая в аргументах функции/метода
⇓ myfunc(123, "text", "and" "more")Строка закрыта слишком поздно
⇓ mysql_evil("SELECT * FROM stuffs); print "'ok'"; ⇑Отступ в HEREDOC
До версии 7.3 закрывающий идентификатор должен был находиться в самом начале новой строки. Поэтому код ниже вызовет ошибку
$test = <<<HTML <link..> HTML; ⇑⇑⇑
Unexpected $end
Unexpected end of file
Ошибка означает, что код закончился, в то время как парсер ожидает больше кода. (Сообщение немного вводит в заблуждение, если понимать его буквально. Речь идет не о переменной с именем «$end», как иногда предполагают новички. Оно относится к «концу файла»). Причина: несовпадение количества открывающих и закрывающих фигурных скобок.
Почти всегда речь идет об отсутствующей закрывающей фигурной скобке } для закрытия предшествующих блоков кода. Это говорит о том, что синтаксический анализатор ожидает найти закрывающую скобку }, но на самом деле достиг конца файла.
- Используйте правильные отступы, чтобы избежать таких проблем. И вообще, в принципе, используйте отступы и форматирование!
- Используйте IDE с сопоставлением скобок, чтобы выяснить, где
}была утеряна. Большинство IDE выделяют совпадающие фигурные скобки, квадратные скобки и круглые скобки. Что позволяет довольно легко проверить соответствие:
Отступ в HEREDOC
До версии 7.3 закрывающий идентификатор должен был находиться в самом начале новой строки. Поэтому код ниже может вызывать ошибку
$test = <<<HTML
<link..>
HTML;
⇑⇑⇑
Заэкранированная кавычка
Символ \ имеет особое значение. Часто символ \ применяют для экранирования в строках. Чтобы кавычка внутри строки, которая обёрнута в такие же кавычки, печаталась как есть, то её экранируют. Т.е. строка echo "Jim said \"Hello\""; выведет Jim said "hello". Если применить последовательность \", то она будет расценена как попытка экранирования кавычки. Поэтому строка ниже, выдаст ошибку
"C:\xampp\htdocs\"
правильно будет экранировать обратные слэши тоже:
"C:\\xampp\\htdocs\\"
С другой стороны, PHP обычно преобразует пути в стиле Unix (например, "C:/xampp/htdocs/") в правильный путь для Windows.
Альтернативный синтаксис
Несколько реже вы можете увидеть эту синтаксическую ошибку при использовании альтернативного синтаксиса для блоков операторов/кодов в шаблонах. Используя if: и else: отсутствует endif;, например (т.е. закрывающий тег)
Unexpected T_FUNCTION
Может возникнуть например в версии PHP ниже 5.3.0, когда не было ещё анонимных функций. В некоторые функции, такие как array_map нужно было передать имя функции обработчика, например $range = array_map( "name_of_function_to_call", $myArray );. Так что минимум надо проверить версию PHP и проверить что именно на вход ожадает текущая функция. И принять решение: повысить версию PHP или переписать под старый стиль: создать отдельно функцию и во вторую передать имя первой.
Unexpected (
Открывающие круглые скобки обычно следуют за языковыми конструкциями, такими как if/foreach/for/array/list, или начинают арифметическое выражение. Они синтаксически неверны после "strings", предыдущих скобок (), одинокого $ и в некоторых типичных контекстах объявлений. Типичные ошибки:
Выражения в параметрах объявленной функции
function calcRating($value, $expires = time() + 90000) {Параметры в объявлении функции могут быть только литеральными значениями или константными выражениями. То есть выражение
time() + 90000нельзя использовать в качестве дефолтного значения параметра функциию. Тем не менее при вызове функции можно свободно использовать выражение:myFunction(1 + anotherFunc() * 2)Выражения в свойствах класса
Как и ошибка выше, нельзя применять выражения для свойств класса, т.е.
class xyz { var $default = someFunction("xyz_default");Если необходимо что-то вычислить, то данные вычисления/выражения стОит помеестить в конструктор класса.
Единственное, PHP 7 позволяет написать
public $property = 1 + 2 + 3;. Но это посзволительно, т.к., по сути, это выражение с константными значениями, не вычисляемое "на лету".isset(()), empty, key, next, current
И
isset()иempty()являются встроенными языковыми конструкциями языка, а не функциями, им необходим прямой доступ к переменной. Если вы непреднамеренно добавите слишком много скобок, то вы создадите доп. выражение:⇓ if (isset(($_GET["id"]))) {Для PHP <= 5.4 будет ошибка
Parse error: syntax error, unexpected '('Для PHP <= 7.0 будет ошибка
Fatal error: Cannot use isset() on the result of an expressionНачиная с версии 7.0 - ошибки не будет
Unexpected )
Висячая запятая при вызове функции/метода
⇓ callfunc(1, 2, );В новых версиях языка позволены висячие запятые при нициализации массивов или списков (а также в объявлении функций/методов), но не при вызове функций/методов
Незавершённые выражения
Например если забыли в арифметическом выражении, то синтаксический анализатор сдается. Потому что он не знает как интерпретировать это:
⇓ $var = 2 * (1 + );Но если забыли закрывающую скобку вдобавок, то получите жалобу о неожиданной точке с запятой.
Foreach as
constantЕсли забыть добавить доллар к переменной:
↓ ⇓ foreach ($array as wrong) {PHP здесь иногда говорит, что вместо этого ожидался
->или?->. Посколькуclass->variableмог бы удовлетворить ожидаемому выражению.
Unexpected {
Фигурные скобки { и } окружают блоки кода. И синтаксические ошибки о них обычно указывают на какую-то неправильную вложенность.
Unmatched subexpressions in an
if(Несовпадающие подвыражения) вifЧаще всего несбалансированные
(и)являются причиной, если парсер жалуется на открывающуюся фигурную скобку{, которая появляется слишком рано. Простой пример:⇓ if (($x == $y) && (2 == true) {Необходимо посчитать все открывающие и закрывающие скобки и сопоставить их количество. Также используйте IDE, которая помогает в этом и не пишите код без пробелов. Удобочитаемость имеет значение.
{ and } в выражениях
Нельзя оборачивать выражения в скобки.
⇓ $var = 5 * {7 + $x};Придётся выражение вынести в переменную и подставлять уже её:
$expr = 7 + $x $var = 5 * $expr;
Unexpected }
Когда получаете ошибку "unexpected }", чаще всего означает, что закрывали блок кода слишком рано.
Последнее выражение в блоке и потеря точки с запятой
function whatever() { doStuff() } ⇧Недопустимая вложенность блоков/Forgotten
{(забытая{)Блок кода был
}закрыт слишком рано, или забыли открытую скобку{:function doStuff() { if (true) ⇦ print "yes"; } } ⇧В приведенном выше фрагменте
ifне было открывающей фигурной скобки{. Таким образом, закрывающая}ниже стала излишней. И поэтому следующая закрывающая}, предназначенная для функции, не была связана с исходной открывающей фигурной скобкой{.
Unexpected {, expecting (
Языковые конструкции, требующие условия/объявления и блока кода, вызовут эту ошибку.
Список параметров функции/метода
⇓ нет скобок и параметров function whatever { }Условные конструкции
⇓ нельзя писать if без какого-либо условия if { }
То же самое для частых используемых конструкций: for/foreach, while/do, etc.
Как минимум всегда смотрите документацию, чтобы сравнить, правильно ли вы пишите ne или иную конструкцию/функцию/метод/класс и т.д.
Unexpected [
Часто возникает в старых версиях PHP. В версии PHP >= 5.4 стал возможен сокращённый синтаксис объявления массивов
$php53 = array(1, 2, 3); // Старый синтаксис
$php54 = [1, 2, 3]; // Новый синтаксис PHP >= 5.4
⇑
Разыменование массивов также с версии 5.4. Оно позволяет, например, сразу же обратиться к ключу массива, который вернула функция.
function getData() {
return ['first' => 1, 'second' => 2];
}
getData()['first'];
⇑ // До версии 5.4 это невозможно
это же касается и встроенных функций, например explode и других, которые возвращают массив
Обязательно проверьте версию PHP
Другие варианты:
Нельзя в свойствах метода сразу внести данные в ячейку массива
protected $var["x"] = "Nope"; ⇑⇑⇑⇑Если это необходимо - делайте это в конструкторе или каком-либо инициализирующием методе
Случайно опеатались и вместо другой скобки поставили квадратную
foreach [$a as $b) ⇑или даже
function foobar[$a, $b, $c] { ⇑Вы пытаетесь использовать ключевое слово
globalдля члена ассоциативного массива. Это недопустимый синтаксис:global $var['key'];
Unexpected ]
Случайно опеатались и вместо другой скобки поставили квадратную
foreach [$a as $b) ⇑Пытаетесь закончить массив там, где его нет:
$var = 2];Часто это возникает во вложенных массивах
$array = [1,[2,3],4,[5,6[7,[8],[9,10]],11],12]],15]; ⇑Используйте IDE для сопоставления скобок и нормально форматируйте код %))
Unexpected T_IF
Unexpected T_FOREACH
Unexpected T_FOR
Unexpected T_WHILE
Unexpected T_DO
Unexpected T_ECHO
Частые проблемы с операторами if, foreach, for, while, list, global, return, do, print, echo
Точка с запятой не там
Довольно часто пропущена точка с запятой в предыдущей строке
⇓ $x = myfunc() if (true) {Код в классе, находится вне методов
class xyz { if (true) {} <-- нельзя так! надо писать в методах!!! foreach ($var) {} <-- нельзя так! надо писать в методах!!!Используются зарезервированные ключевые слова в качестве идентификаторов
Нельзя использовать
do,ifи другие языковые конструкции в качестве имён функций/методов или имён классов.СтоИт точка с запятой вместо двоеточия (:) или фигурной скобки ({) после блока управления
Управляющие структуры обычно заключены в фигурные скобки, но в альтернативном синтаксисе могут использоваться двоеточия. Если там случайно использовать точку с запятой, то преждевременно закрывается этот самый блок:
foreach ($errors as $error); <-- должно быть : или {
Unexpected T_LNUMBER
Недопустимые имена переменных
Имена переменных не могут начинаться с цифры. Первый символ должен быть буквенным или символом подчеркивания.
$1 // Плохо $_1 // Хорошо
Довольно часто появляется при использовании
preg_replace-заполнителей"$1"но в контексте функций непосредственно PHP:# ↓ ⇓ ↓ preg_replace("/#(\w+)/e", strtopupper($1) )Там, где callback - должны были быть кавычки. Однако их пропустили (P.S. флаг
/eустарел, но иногда он всё еще неправильно используется вpreg_replace_callback)Хотя токенизатор/парсер не допускает буквального
$1в качестве имени переменной, можно использовать${1}или${"1"}. Это синтаксический обходной путь для нестандартных идентификаторов. (Лучше думать об этом как о поиске в локальной области. Но в целом: для таких случаев предпочитайте простые массивы!)
Обращение к нумерованному ключу объекта через стрелочку ->
Обычно возникает в объектах типа
stdClass Object, появляющиеся послеjson_decodeбез флагаtrue↓ $json->0->valueПравильно будет:
↓↓↓ $json->{0}->valueПропущены запятые в объявлении массивов
# ↓ ↓ $xy = array(1 2 3);Или подобное, но в параметрах функции или конструкций:
func(1, 2 3);` ^---- function xy($z 2); ^----- for ($i=2 3<$z) ^----Обычно один из знаков, таких как
;или,пропущен при разделении списка выражений.Ошибка расстановки кавычек, несовпадение кавычек
# ↓ ↓ echo "<td colspan="3">something bad</td>";Подробно описано про кавычки в Unexpected T_STRING errors.
Другие идентификаторы
Ни функции, ни классы, ни пространства имен не могут начинаться с числа:
↓ function 123shop() {
Unexpected '?'
Если вы пытаетесь использовать тег <?php внутри другого такого же тега <?php*
$var = 'hello '<?php echo 'world'; ?>;
* Для PHP версий 4.3.1, 4.3.5 - 4.3.11, 4.4.0 - 4.4.1, 5.0.0 - 5.0.5, 4.4.2 - 4.4.9, 5.1.0 - 5.1.6, 5.2.0 - 5.2.17, 5.3.0 - 5.3.29, 5.4.0 - 5.4.45, 5.5.0 - 5.5.38, 5.6.0 - 5.6.40, 7.0.0 - 7.0.33, 7.1.0 - 7.1.33, 7.2.0 - 7.2.34, 7.3.0 - 7.3.31, 7.4.0 - 7.4.24
Если используется оператор null coalescing operator ?? в версиях PHP ниже, чем PHP 7
<?= $a ?? 2; // Работает в PHP 7+
<?= (!empty($a)) ? $a : 2; // Работает во всех версиях PHP
Unexpected '?', expecting variable
Аналогичная ошибка может возникнуть для типов, допускающих значение NULL, например:
function add(?int $sum): ?int {
Что снова указывает на то, что используется устаревшая версия PHP (то же касается CLI). Проверьте версию PHP через phpinfo();. Необходимо будет либо повысить версию, либо переписать код под старые версии, без использования нового синтаксиса
Unexpected 'continue' (T_CONTINUE)
Оператор continue используется только внутри циклических структур для пропуска оставшейся части текущей итерации цикла и, при соблюдении условий, начала следующей итерации. continue не возвращает значения
Таким образом continue нельзя использовать в тернарном операторе или любом операторе, требующем возвращаемого значения (return).
Unexpected 'break' (T_BREAK)
То же самое касаестся break;. Нельзя использовать в выражениях (те, что могут вернуть значение). Используется внутри for, foreach, while, do-while или switch.
Unexpected 'return' (T_RETURN)
Если на предыдущих строках произошла синтакцическая ошибка, то при приходе к слову return будет подобная ошибка. Например:
is ($value == null) { // Ожидалось что будет if
return $this->unban();
}
или
mysql_query("INSERT INTO 'users' VALUES ('', '$email', '$name', '".md5 ($password)."')"
^^^ нет знаков );
return mysql_insert_id();
При данной ошибке ищите синтаксическую ошибку раньше указанного места в тексте ошибки, а не прямо на этой же строчке.
Unexpected '='
Может быть вызвано наличием недопустимых символов в имени переменной. Имена переменных должны соответствовать следующим правилам:
Имена переменных соответствуют тем же правилам, что и остальные наименования в PHP. Правильное имя переменной должно начинаться с буквы или символа подчёркивания и состоять из букв, цифр и символов подчёркивания в любом количестве. Это можно отобразить регулярным выражением: ^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$
Замечание: Под буквами здесь подразумеваются символы a-z, A-Z и байты от 128 до 255 (0x80-0xff).
Unexpected T_PAAMAYIM_NEKUDOTAYIM
T_PAAMAYIM_NEKUDOTAYIM - это наименование для двойного двоеточия :: на иврите ¯\_(ツ)_/¯
Происходит использование двойного двоеточия, вместо стрелочки объекта (статический вызов, вместо вызова метода в нестатическом контексте).
Например в коде указано $cnf::getConfig($key);, а должно быть $cnf->getConfig($key);
Это было возможно в ранних версиях. Возможно ошибка появилась после переноса куда-либо (например нахостинг). Поэтому проверьте версию PHP и либо установится такую же версию, на которой было разработано приложение, либо измените вызов свойства/метода на вызов их не в статическом виде
Unexpected T_OBJECT_OPERATOR
В очень старых версиях PHP (4) нельзя делать "method chaining", т.е. консрукция ниже не сработает
$item->get_enclosure()->get_link()В версиях ниже *PHP 5.4* нельзя вызвать метод у только что созданного объекта
$purchaseOrder = (new PurchaseOrderFactory)->instance();можно вначале создать объект, а только потом вызвать у него метод:
$purchaseFactory = new PurchaseOrderFactory; $purchaseOrder = $purchaseFactory->instance();Также нужно обратить внимание на круглые скобки, писать
new PurchaseOrderFactory->instance();нельзя, это невалидно!Пропущен знак доллара у переменной.
Например написано
mysqli->query, а должно быть$mysqli->queryили написаноthis->transform($lessons)а должно быть$this->transform($lessons)
Unexpected T_DOUBLE_ARROW
Причины:
Использование `=>` при описании массива, но при этом ключевое слово объявления массива было забыто:
$statement->execute( ':login'=>$_POST['email'] );должно быть
$statement->execute(array(':login' => $_POST['email']));Пропущена запятая перед объявлением массива
Route::post('/updateaccount'[ ⇑ 'uses' => 'UserController@postSaveAccount', 'as' => 'account.save' ]);должно быть
Route::post('/updateaccount', [ ⇑ 'uses' => 'UserController@postSaveAccount', 'as' => 'account.save' ]);Пропущена какой-то закрывающий элемент в пересислении массива
$saveData = array( 'mid' => $this->_saveAsUserId, 'post_name' => slug($thisShow['title'], ⇑ Пропущена закрывающая скобка функции slug 'post_content' => $thisShow['content'], );
Unexpected T_BOOLEAN_OR Unexpected T_BOOLEAN_AND
Возникают, как правило, вследствие несовпадения открывающих и закрывающих круглых скобок. Пример
if(is_file($filechk1) && (is_file($filechk2))) || (is_file($dirchk1) && (is_file($dirchk2))){
⇑
...
}
или
if ($args == !empty && $command != 'reload'){
^^^^^^ Невалидно. должно быть `!empty($args)`
}
или
if(isset($_GET['test'] && strcmp($_GET['test'],'test') == 0)
⇑
Решение: проверьте весь код на соответствие скобок друг другу! Если нужно, то выносите сложные конструкции в отдельные переменные, чтобы не путаться и работайте с ними. Пример
if (IS_REGISTRATOR() && (($params.status === 'W' || $params.status === 'D' || $params.status === 'A') && $params.remark && (($params.subres_level == 0 && ($user_info->selected_title->tid == $params.boss || $user_info->selected_title->tid == $doc_signer_tid || !$params.usertid) || $params.subres_level > 0 && $user_info->selected_title->tid == $params.usertid))) { ... }
этот код будет читаться легче в таком виде:
$docIsInWorkAcceptOrDraft = ...;
$bossHasSignerPriviledge = ...;
$userCanSign = ...;
if ($docIsInWorkAcceptOrDraft && $bossHasSignerPriviledge && $userCanSign) {
// ...
}
Unexpected T_IS_EQUAL
Unexpected T_IS_GREATER_OR_EQUAL
Unexpected T_IS_IDENTICAL
Unexpected T_IS_NOT_EQUAL
Unexpected T_IS_NOT_IDENTICAL
Unexpected T_IS_SMALLER_OR_EQUAL
Unexpected <
Unexpected >
Операторы сравнения, такие как ==, >=, ===, !=, <>, !== and <= or < and > в основном должны использоваться только в выражениях, таких как if. Если синтаксический анализатор жалуется на них, то это часто означает несовпадение в парах скобок, несоответствие скобок ( ) вокруг выражений.
Группировка в выражениях
В частности, для операторов
ifс множественными сравнениями, вы должны позаботиться о правильном подсчете открывающих и закрывающих скобок (!!!):⇓ if (($foo < 7) && $bar) > 5 || $baz < 9) { ... } ↑Здесь условие
ifслучайно завершено скобкой)и дальше парсер не понимает что происходитСмешивание isset()/empty() и сравнения
⇓ пропущена закрывающая скобка if (empty($_POST["var"] == 1)) {Или:
⇓ if (isset($variable !== "value")) {Это не имеет смысла для PHP, потому что
issetиempty— языковые конструкции, которые принимают только имена переменных. Также не имеет смысла сравнивать результат этих конструкций с чем-либо, потому что результат этих конструкций - логический.Путаница
>=больше или равно с оператором массива=>Оба оператора выглядят примерно одинаково, поэтому их иногда путают:
⇓ if ($var => 5) { ... }Нужно помнить, что этот оператор сравнения называется "больше, чем или равно" (greater than or equal), чтобы все было правильно.
Не с чем сравнивать
Нельзя объединить два сравнения, если они относятся к одной и той же переменной:
⇓ if ($xyz > 5 && < 100)Необходимо каждый раз сравнивать значение переменной:
if ($xyz > 5 && $xyz < 100)Цепочки сравнения
Также нельзя сравнивать значение переменной одновременно с несколькими значениями. В математике, например, конструкция ниже позволена:
⇓ $result = (5 < $x < 10);Однако в PHP такое не допустимо. Следует, как указано выше, сравнивать значение каждый раз, т.е.
$result = ($x > 5 && $x < 10);Unexpected
>
Unexpected<Операторы больше
>или меньше<не имеют пользовательского имени токенизатораT_XXX. Чаще всего ошибка возникает, когда не так расставлены кавычки в HTML коде:⇓ print "<a href='z">Hello</a>"; ↑В текущем случае получается, что строка сравнивается через
>с константойHelloи затем происходит ещё одно сравнение с помощью<. По крайней мере, так это видит PHP. Настоящей причиной и синтаксической ошибкой было преждевременное завершение строки.Вложенные теги также вызывают ошибку::
<?php echo <?php my_func(); ?> ↑
Unexpected 'public' (T_PUBLIC)
Unexpected 'private' (T_PRIVATE)
Unexpected 'protected' (T_PROTECTED)
Unexpected 'final' (T_FINAL)
Ключевые слова public/private/protected/final можно использовать только внутри класса в качестве модификатора для свойств или методов. Ключевое слово final может применяться ещё и для обозначения самого класса как финального.
Ошибка может заключаться в применении этих слов для простых функций вне класса, например
<?php
public function echoTest() {
echo 'test';
}
Это неправильно! Нужно использовать только в классах!
Если же это происходит в классе, то смотрите на соответствия фигурных скобок закрывающих и открывающих - где-то может не хватать закрывающей фигурной скобки и в итоге парсер не ожидает увидеть ключевое слово.
Unexpected T_STATIC
Может возникать в классе, когда используется позднее статическое связывание через ключевое слово static
class Employee {
public static $favSport = "Football";
public static function watchTV() {
echo "Watching ".static::$favSport;
}
}
Частой причиной может быть рання версия языка. Ключевое слово появилось в версии 5.3. Возможно у вас стоИт более ранняя версия.
Также если в классе static применяется в качестве возвращаемого значения:
public function setDefault(string $option, mixed $value): static
Данное возвращаемое значение можно использовать в языке в версии 8.0+. Проверьте свою версию PHP
Unexpected T_CLASS
Может возникать в классе, когда используется позднее статическое связывание через ключевое слово [::class](https://www.php.net/manual/ru/language.oop5.basic.php#language.oop5.basic.class.class)
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
Частой причиной может быть рання версия языка. Ключевое слово появилось в версии 5.5. Возможно у вас стоИт более ранняя версия.
Ещё может быть случайно строка представлена константой. Пример:
$host=""MyHost"";
Тут ошибка заключается в том, что вместо того, чтобы написать одну двойнуй кавычку слева и одну справа, двойные кавычки написаны по две штуки. В итоге получается слева пустая строка и справа, а host это какая-то константа, воспринимаемая как указание на какой-то класс
Unexpected 'use' (T_USE)
Может возникать в классе, когда используется ключевое слово use используется для импорта класса, но используется оно не до объявления класса/функции, а внутри него. Пример:
function test() {
use Coinbase\Wallet\Client;
use Coinbase\Wallet\Configuration;
...
}
Все импорты классов должны быть в самом начале файла:
<?php
use Coinbase\Wallet\Client;
use Coinbase\Wallet\Configuration;
class Test {
function test() {
...
...
}
}
Исключение составляют трейты, которые могут использовать use внутри класса для импорта трейта (см. документацию)
Ещё проблема может возникать при использовании use для именованных функций. Это неверно! Оно может использоваться только для анонимных функций. Пример:
// НЕВЕРНО!!!
function checkValue($arrPostKey, $value) use ($errors) {
^^^^
...
};
// ВЕРНО
$checkValue = function($arrPostKey, $value) use (&$errors) {
...
}
Ещё одна проблема: в перечислении импортов сверху класса была забыта точка с запятой:
use Illuminate\Http\Request;
use Auth;
use App\Task <-----
use App\Project;
Unexpected T_DNUMBER
Частая проблема: использовать данные как есть, вместо оборачивания их как строки. Пример:
// НЕВЕРНО
$this->Server = mysql3.000webhost.com; // как итог: видим 3.000 ... на что и ругается парсер.
// ВЕРНО
$this->Server = 'mysql3.000webhost.com';
^--- ^---



