Логические ошибки
Логические ошибки имеют мало отношения к собственно конструкциям языка. Фактически логические ошибки происходят в коде, синтаксически и семантически корректном. О логических ошибках говорят, когда программист предполагает, что код будет делать что-то одно, а код делает что-то другое. Классическим примером является ошибочное написание имени переменной, что приводит к неприятностям, поскольку РНР не требует заранее объявлять переменные. Такие ошибки трудно выявить при отсутствии хороших контрольных примеров. Рассмотрим пример логической ошибки:
<?php
//Logical_Error,php
for ($i = 1; $i < 10; $i++)
print( "Number:" . $i , "<br>");
?>
Здесь программист хотел, чтобы сценарий вывел числа от 1 до 10 включительно. Однако поскольку вместо оператора сравнения <= был указан оператор <, последнее сравнение 10 < 10 завершилось неудачей и были выведены числа только от 1 до 9.
Конструкция f о reach, которая есть в РНР4, предотвращает возникновение таких ошибок при работе с массивами. Практический совет: использовать конструкцию о reach для обхода массивов.
Ошибки окружения
Ошибки окружения возникают в результате внешних по отношению к программе факторов и часто проходят незамеченными в контрольных примерах, предназначенных для поиска синтаксических, семантических и логических ошибок. Эти ошибки всплывают тогда, когда внешние объекты - файлы, сетевые соединения или входные данные - принимают неожиданный вид или ведут себя неожиданным для программы образом. Допустим, например, что сценарий открывает на локальном диске сервера файлы для записи. Во время создания этот сценарий может функционировать прекрасно, однако в реальной среде вызовет отказ, поскольку права доступа окажутся значительно более ограниченными, чем на рабочей станции разработчика.
Другой пример - это программа, которая предполагает ввод данных на определенном языке, но, будучи развернута в системе с другими настройками языка и стандартов, оказывается неработоспособной. Единственный способ предотвратить ошибки окружения состоит в том, чтобы обеспечить проверку взаимодействия с внешними объектами и проконтролировать код. Кроме того, такое взаимодействие требует структурированной обработки ошибок, если результаты такого взаимодействия не согласуются с ожиданиями программы.
Часто некоторые функции (в основном скрытые) или их аргументы оказываются недоступны на некоторых платформах, на которых работает РНР, например функция socket () для создания сетевого сокета в большинстве UNIX- подобных систем принимает в качестве аргумента протокол AF_UNIX, однако это значение не поддерживается в Microsoft Windows (подробности см. в главе 13). Тем не менее обычно можно написать код так, чтобы он не содержал специфические для платформы функции.