Неверное применение семантики языка
Многие программисты используют в своей работе 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' ); ?>