Как определить, содержит ли переменная указатель файла в PHP? - PullRequest
3 голосов
/ 26 ноября 2008

Точно так же, как говорится в вопросе: как проверить, содержит ли переменная в PHP указатель на файл? Некоторые как is_string() или is_object().

Ответы [ 3 ]

10 голосов
/ 26 ноября 2008

Вы можете использовать get_resource_type() - http://us3.php.net/manual/en/function.get-resource-type.php. Функция вернет FALSE, если вообще не является ресурсом.

$fp = fopen("foo", "w");
...
if(get_resource_type($fp) == 'file' || get_resource_type($fp) == 'stream') {
    //do what you want here
}

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

2 голосов
/ 26 ноября 2008

Как уже было сказано, вы можете использовать stream_get_meta_data или get_resource_type, чтобы проверить тип ресурса, с которым вы имеете дело.

Лучший и более надежный способ - использовать SPL для работы с файлами, он может избавить от головной боли и сделать вашу жизнь более приятной. Эта возможность еще не очень хорошо документирована, поэтому многие разработчики создают свои собственные оболочки для файловых объектов, но вы можете найти все, что вам нужно здесь:

http://www.php.net/~helly/php/ext/spl/classSplFileObject.html

http://www.php.net/~helly/php/ext/spl/classSplFileInfo.html

Первый содержит методы для чтения, записи, поиска файла и т. Д. ...

Второй предоставляет мета-информацию об объекте, с которым вы работаете, среди прочих есть метод:

$ object-> ISFILE ();

2 голосов
/ 26 ноября 2008

Для этого вы можете использовать stream_get_meta_data().

<?php
$f = fopen('index.php', 'r');
var_dump(stream_get_meta_data($f));
?>

array
  'wrapper_type' => string 'plainfile' (length=9)
  'stream_type' => string 'STDIO' (length=5)
  'mode' => string 'r' (length=1)
  'unread_bytes' => int 0
  'seekable' => boolean true
  'uri' => string 'index.php' (length=9)
  'timed_out' => boolean false
  'blocked' => boolean true
  'eof' => boolean false

Вы можете поставить префикс @, чтобы подавить предупреждения, если переменная не является ресурсом, - тогда просто проверьте, не вернул ли он значение false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...