Каковы синтаксические ошибки?
PHP принадлежит к языкам программирования C-стиля и императива . Он имеет жесткие правила грамматики, которые он не может восстановить после столкновения с неуместными символами или идентификаторами. Он не может угадать ваши намерения кодирования.
Самые важные советы
Есть несколько основных мер предосторожности, которые вы всегда можете предпринять:
-
Используйте правильный отступ кода или используйте любой высокий стиль кодирования. Считываемость предотвращает нарушения.
-
Используйте IDE или редактор для PHP с подсветкой синтаксиса . Что также помогает с балансировкой скобок / скобок.
-
Прочтите ссылку на язык и примеры в руководстве. Дважды, чтобы стать достаточно опытным.
Как интерпретировать ошибки парсера
Типичное сообщение с синтаксической ошибкой гласит:
Ошибка анализа: синтаксическая ошибка, неожиданный T_STRING , ожидающий '
.user.ini
' в файле.php в строке 217
В котором перечислены возможные места синтаксической ошибки. См. Указанное имя файла и номер строки .
Кличка , такие , как T_STRING
объясняет , какой символ анализатор / токенизатор не смог обработать окончательно. Однако это не обязательно является причиной синтаксической ошибки.
Важно также изучить предыдущие строки кода . Часто синтаксические ошибки - это просто неудачи, которые произошли ранее. Номер строки ошибки - это то, где синтаксический анализатор окончательно отказался обрабатывать все это.
Устранение синтаксических ошибок
Существует множество подходов к сужению и исправлению синтаксических икота.
-
Откройте указанный исходный файл. Посмотрите на указанную строку кода .
-
Для убегающих строк и неуместных операторов это обычно означает, что вы находите виновника.
-
Прочитайте строку слева направо и представьте, что делает каждый символ.
-
-
Регулярно вы также должны смотреть на предыдущие строки .
-
В частности, отсутствующие
test.php
точки с запятой отсутствуют в предыдущей строке end / statement. (По крайней мере, с стилистической точки зрения.) -
Если блоки кода некорректно закрыты или вложены, вам может потребоваться еще более изучить исходный код. Для упрощения используйте правильный отступ кода .
<?php error_reporting(E_ALL); ini_set("display_errors", 1); include("./broken-script.php");
error_log
-
-
Посмотрите на раскраску синтаксиса !
-
Строки, переменные и константы должны иметь цвета с ошибкой.
-
Операторы также
[
должны быть тонированы. [они могут быть в неправильном контексте. -
Если вы видите, что раскраска строк слишком длинная или слишком короткая, вы обнаружите скрытый или отсутствующий заголовок
"
или'
маркер строки. -
Наличие двух одинаковых символов пунктуации рядом друг с другом также может означать проблему. Как правило, операторы одиночкой , если это не
array()
,--
или круглые скобки после оператора. Две строки / идентификаторы, которые непосредственно следуют друг за другом, являются неправильными в большинстве контекстов.
-
-
Пробел - ваш друг . Следуйте любому стилю кодировки.
-
Временно разбить длинные линии.
-
Вы можете свободно добавлять новые строки между операторами или константами и строками. Затем анализатор конкретизирует номер строки для ошибок синтаксического анализа. Вместо того, чтобы смотреть на очень длинный код, вы можете выделить отсутствующий или неуместный синтаксический символ.
-
Разделение сложных
if
операторов на отдельные или вложенныеif
условия. -
Вместо длинных математических формул или логических цепей используйте временные переменные для упрощения кода. (Более читаемый = меньше ошибок.)
-
Добавьте новые строки между:
- Код, который вы можете легко определить как правильно,
- Части, о которых вы не знаете,
- И строки, на которые жалуется парсер.
Разделение длинных блоков кода действительно помогает найти происхождение ошибок синтаксиса.
-
-
Прокомментируйте код нарушения.
-
Если вы не можете изолировать источник проблемы, начните комментировать (и тем самым временно удалить) блоки кода.
-
Как только вы избавитесь от ошибки синтаксического анализа, вы обнаружили источник проблем. Посмотрите внимательно.
-
Иногда вы хотите временно удалить полные блоки функций / методов. (В случае непревзойденных фигурных скобок и кода с неправильным отступом).
-
Если вы не можете решить проблему синтаксиса, попробуйте переписать разделы с комментариями с нуля .
-
-
Как новичок, избегайте некоторых запутанных конструкций синтаксиса.
-
Оператор тернарного состояния может компактно кодировать код и действительно полезен. Но во всех случаях это не способствует удобочитаемости. Предпочитайте простые выражения, пока они не отображаются.
$php53 = array(1, 2, 3); $php54 = [1, 2, 3]; ?
if
-
Альтернативный синтаксис PHP ( / / ) распространен для шаблонов, но, возможно, менее прост в использовании, чем обычные кодовые блоки.
$result = get_whatever()["key"]; ?
[
SetHandler php56-fcgi
[
protected $var["x"] = "Nope"; ?
-
-
Наиболее распространенными ошибками новичка являются:
-
Отсутствуют точки с запятой
[
для завершающих операторов / строк. -
Неисправные строковые кавычки для
"
или или без'
кавычек внутри. -
Забытые операторы, в частности для
.
конкатенации строк. -
Несбалансированные
(
круглые скобки)
. Подсчитайте их в строке отчета. Есть ли их равное число?
-
-
Не забывайте, что решение одной проблемы синтаксиса может выявить следующее.
-
Если вы делаете одну проблему, уходите, а другие появляются в некотором коде ниже, вы в основном находитесь на правильном пути.
-
Если после редактирования новая синтаксическая ошибка возникает в той же строке, ваше попытка изменения может быть неудачной. (Не всегда, хотя.)
-
-
Восстановите резервную копию ранее работающего кода, если вы не можете его исправить.
- Принять систему управления версиями исходного кода. Вы всегда можете просмотреть
diff
неисправную и последнюю рабочую версию. Что может быть полезным для понимания проблемы синтаксиса.
- Принять систему управления версиями исходного кода. Вы всегда можете просмотреть
-
Невидимые бродячие символы Unicode : в некоторых случаях вам нужно использовать hexeditor или другой редактор / просмотрщик на вашем источнике. Некоторые проблемы не могут быть найдены только с точки зрения вашего кода.
-
Попробуйте
{
в качестве первой меры найти символы, отличные от ASCII. -
В частности, спецификации, пробелы нулевой ширины или неразрывные пробелы, а также умные кавычки регулярно могут найти свой путь в исходный код.
-
-
Позаботьтесь о том, какие типы строк будут сохранены в файлах.
-
PHP просто чтит новые строки, а не возврат каретки.
-
Иногда это проблема для пользователей MacOS (даже для ОС (X для неправильно настроенных редакторов).
-
Это часто возникает только как проблема, когда используются однострочные
//
или#
комментарии. Многострочные комментарии редко нарушают парсер, когда разрывы строк игнорируются.foreach [$a as $b) ?
-
-
Если ваша синтаксическая ошибка не передается через Интернет : бывает, что на вашем компьютере есть синтаксическая ошибка. Но публикация того же файла в Интернете больше не демонстрирует его. Что может означать только одно из двух:
-
Вы смотрите на неправильный файл!
-
Или ваш код содержит невидимый бездомный Unicode (см. Выше). Вы можете легко узнать: просто скопируйте свой код из веб-формы в текстовый редактор.
-
-
Проверьте свою версию PHP . Не все синтаксические конструкции доступны на каждом сервере.
-
Не используйте зарезервированные ключевые слова PHP как идентификаторы для функций / методов, классов или констант.
-
Trial-and-error - ваше последнее средство.
Если все остальное не удается, вы всегда можете отправить сообщение об ошибке. Символы синтаксиса не так легко найти (Stack Overflow сам индексируется SymbolHound, хотя). Поэтому перед тем, как найти что-то важное, вы можете просмотреть еще несколько страниц.
Дальнейшие руководства:
- Основы отладки PHP Дэвидом Скларом
- Исправление ошибок PHP от Джейсона Маккрири
- Ошибки PHP - 10 распространенных ошибок Марио Лурига
- Общие ошибки и решения PHP
- Устранение неполадок и исправление веб-сайта WordPress
- Руководство по сообщениям об ошибках PHP для дизайнеров - Smashing Magazine
Белый экран смерти
Если ваш сайт просто пуст, то, как правило, причиной является синтаксическая ошибка. Включите их отображение:
function foobar[$a, $b, $c] { ?
$var = const[123]; ?
В const
общем, или $
для mod_php, или даже $varname
с настройками FastCGI.
Включение его в сломанный скрипт слишком поздно, потому что PHP не может даже интерпретировать / запускать первую строку. Быстрое обходное решение создает сценарий оболочки, например ]
:
]
Затем вызовите неисправный код, обратившись к этому сценарию оболочки.
Это также помогает включить PHP )
и посмотреть на ваш веб-сервер,}
когда скрипт выходит из строя с ответами HTTP 500.