Распространенные синтаксические ошибки связаны с пропуском парных скобок и других знаков пунктуации, ошибками в написании ключевых слов, пропущенным знаком $ перед переменными и т. п. Большинство синтаксических ошибок представляют собой опечатки или совершаются новичками, еще недостаточно освоившими синтаксис. Обычно можно найти строку, в которой есть синтаксическая ошибка, поскольку анализатор сообщает об ошибке вместе с номером строки. Однако так бывает не всегда, о чем свидетельствует следующий пример:
<?php
//Sample.php
for ($count 0; Scount 10; ++$count)
echo(Scount) . .
<h2>Sample program</h2> <?php
ends
?> . . ... '
В данном случае анализатор не сообщает об ошибке в строке 4, где пропущена точка с запятой после оператора echo.
Семантические ошибки
Семантические ошибки могут пройти незамеченными анализатором, поскольку строки, содержащие их, синтаксически корректны. Однако когда выполнение достигает такой строки, может произойти отказ. Семантические ошибки часто возникают при вызове функций, потому что РНР не сравнивает сигнатуру аргументов функции с аргументами, задаваемыми при вызове. Иными словами, если функция определена как имеющая два аргумента, а вызывается лишь с одним, синтаксический анализатор не обнаружит этого, но выполнение программы будет прервано.
Другим примером является использование в операции неправильного оператора. Поскольку РНР - язык со слабой типизацией, большинство операторов обычно работает с переменными любых типов, однако результат может оказаться бессмысленным.
Применение оператора умножения к двум символьным строкам даст в результате ноль, потому что РНР преобразует обе строки к нулевым значениям и перемножит их. Это относится к случаям, когда строки не выглядят как числа. Если строка выглядит как число и фигурирует в числовом контексте, будет взято число, которое можно из этой строки извлечь. Например, следующий код возвращает в броузер число 404:
<?php
//String_Mult.php
echo("101 Dalmations" * "4 Beatles"); ?>
Рассмотрим другую распространенную семантическую ошибку в операторе switch:
<?php
//Sample_Switch.php $color =
switch (Scolor) { case "персиковый":
еспо("Мой любимый цвет персиковый <br>");
case "розовый":
любимый цвет
}
?>
Будет получен неожиданный результат: оба цвета - персиковый и розовый - окажутся любимыми. Синтаксически эта конструкция верна и может оказаться полезной, если требуется выразить условие логического ИЛИ между двумя случаями (см. ниже). Отсутствие оператора break после первого echo привело к проваливанию и выполнению следующего оператора.