Статьи,обзоры,справочники по PHP

       

Неверное применение семантики языка


Многие программисты используют в своей работе PHP , фактически не понимая тонкостей этого языка. Одна из тонкостей – разница между синтаксисом и семантикой PHP.

  • Синтаксис PHP:Представляет собой набор правил для определения элементов языка. Например, как мы определяем переменную? Ставим знак $ перед ее именем. Как определяем функцию? В общем случае, используя скобки, аргументы и т.п.
  • Семантика PHP: Представляет собой набор правил для применения синтаксиса. Например, возьмем функцию с двумя аргументами, что определяется ее синтаксисом. Причем в качестве аргументов ей следует передавать переменные строкового типа љ– это определяется семантикой.
  • Заметьте: «следует». В языках с четким разделением типов (таких как Java или C) нет понятия «следует» (в общем случае, хотя бывают и исключения). В таком случае компилятор вынудит использовать переменные строго определенного типа.

    Языки, в которых отсутствует само определение типов переменных, предоставляют больше гибкости в написании кода. Но, как бы то ни было, в случае неправильного использования семантики для большинства функций PHP следует ожидать появления сообщения об ошибке.

    Возьмем кусок кода, который открывает файл и выводит его построчно:

    <?php

    $fp = @fopen( 'somefile.txt', 'r' ) or die ( 'Не могу открыть файл somefile.txt' );

    while ($line = @fgets ( "$fp", 1024)) // Здесь ошибка!

    { print $line; }

    @fclose ("$fp") // И здесь тоже color

    or die( 'Не могу закрыть файл somefile.txt' );

    ?>

    В данном случае появится сообщение об ошибке типа:
    "Warning: Supplied argument is not a valid File-Handle resource in tst.php on line 4"
    ("Внимание: аргумент не может являться дескриптором файла")

    Это вызвано тем, что переменная $fp заключена в двойные кавычки, что однозначно определяет ее как строку, тогда как функция fopen() ожидает в качестве первого аргумента дескриптор, но не строку. Соответственно, вам следует использовать переменную, которая может содержать дескриптор.

    Примечание: В данном случае, строковый тип допустим синтаксически.

    Для решения проблемы следует просто убрать двойные кавычки:

    <?php

    $fp = @fopen ( 'somefile.txt', 'r' ) or die ( 'Не могу открыть файл somefile.txt' );

    while ( $line = @fgets ($fp, 1024) )
    { print $line; }

    @fclose ($fp)   or die ( 'Не могу закрыть файл somefile.txt' ); ?>



    Содержание раздела