Класс SplFileObject
(PHP 5 >= 5.1.0, PHP 7)
Введение
Класс SplFileObject предоставляет объектно-ориентированный интерфейс для файлов.
Обзор классов
/* Константы */
/* Методы */
public __construct
( string
$filename
[, string $open_mode
= "r"
[, bool $use_include_path
= false
[, resource $context
]]] )
public array fgetcsv
([ string
$delimiter
= ","
[, string $enclosure
= "\""
[, string $escape
= "\\"
]]] )
public void setCsvControl
([ string
$delimiter
= ","
[, string $enclosure
= "\""
[, string $escape
= "\\"
]]] )/* Наследуемые методы */
public SplFileObject SplFileInfo::openFile
([ string
}$open_mode
= "r"
[, bool $use_include_path
= false
[, resource $context
= NULL
]]] )Предопределенные константы
SplFileObject::DROP_NEW_LINE
-
Удаляет символы переноса в конце строки.
SplFileObject::READ_AHEAD
-
Читает при использовании функций rewind/next.
SplFileObject::SKIP_EMPTY
-
Пропускает пустые строки с файле. Для правильной работы требуется включить флаг
READ_AHEAD
. SplFileObject::READ_CSV
-
Читает строки в формате CSV.
Список изменений
Версия | Описание |
---|---|
5.3.9 |
Значение SplFileObject::SKIP_EMPTY изменено на 4.
Раньше значение было равным 6.
|
Содержание
- SplFileObject::__construct — Конструктор класса SplFileObject
- SplFileObject::current — Получение текущей строки файла
- SplFileObject::eof — Проверяет, достигнут ли конец файла
- SplFileObject::fflush — Сбрасывает буфер вывода в файл
- SplFileObject::fgetc — Читает символ из файла
- SplFileObject::fgetcsv — Получение строки файла и ее разбор в соответствии с CSV разметкой
- SplFileObject::fgets — Читает строку из файла
- SplFileObject::fgetss — Получение строки из файла с очисткой от HTML тэгов
- SplFileObject::flock — Портируемая блокировка файла
- SplFileObject::fpassthru — Выводит все оставшееся содержимое файла в выходной поток
- SplFileObject::fputcsv — Записывает массив с полями в виде строки CSV
- SplFileObject::fread — Read from file
- SplFileObject::fscanf — Разбор строки файла в соответствии с заданным форматом
- SplFileObject::fseek — Перевод файлового указателя на заданную позицию
- SplFileObject::fstat — Получает информацию о файле
- SplFileObject::ftell — Определение текущей позиции файлового указателя
- SplFileObject::ftruncate — Обрезает файл до заданной длины
- SplFileObject::fwrite — Запись в файл
- SplFileObject::getChildren — Метод-заглушка
- SplFileObject::getCsvControl — Получает символы разделителя и ограничителя для CSV
- SplFileObject::getCurrentLine — Псевдоним метода SplFileObject::fgets
- SplFileObject::getFlags — Получает флаги настройки объекта SplFileObject
- SplFileObject::getMaxLineLen — Получает максимальную длину строки
- SplFileObject::hasChildren — Класс SplFileObject не имеет наследников
- SplFileObject::key — Получение номера строки
- SplFileObject::next — Читает следующую строку
- SplFileObject::rewind — Перевод файлового указателя в начало файла
- SplFileObject::seek — Перевод файлового указателя на заданную строку
- SplFileObject::setCsvControl — Устанавливает символы разделителя и ограничителя для CSV
- SplFileObject::setFlags — Устанавливает флаги для SplFileObject
- SplFileObject::setMaxLineLen — Устанавливает максимальную длину строки
- SplFileObject::__toString — Псевдоним SplFileObject::current
- SplFileObject::valid — Проверяет, достигнут ли конец файла (EOF)
Коментарии
Note that this class has a private (and thus, not documented) property that holds the file pointer. Combine this with the fact that there is no method to close the file handle, and you get into situations where you are not able to delete the file with unlink(), etc., because an SplFileObject still has a handle open.
To get around this issue, delete the SplFileObject like this:
---------------------------------------------------------------------
<?php
print "Declaring file object\n";
$file = new SplFileObject('example.txt');
print "Trying to delete file...\n";
unlink('example.txt');
print "Closing file object\n";
$file = null;
print "Deleting file...\n";
unlink('example.txt');
print 'File deleted!';
?>
---------------------------------------------------------------------
which will output:
---------------------------------------------------------------------
Declaring file object
Trying to delete file...
Warning: unlink(example.txt): Permission denied in file.php on line 6
Closing file object
Deleting file...
File deleted!
---------------------------------------------------------------------
If you want to skip blank lines when reading a CSV file, you need *all * the flags:
$file->setFlags(SplFileObject::READ_CSV | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE);
Complimenting marcus at synchromedia dot co dot uk comment, you can also do something like this:
<?php
// create a SplFileObject for reading - note that there are no flags
$file = new SplFileObject('/path/to/file', 'r');
// iterate over its contents
while (!$file->eof()) {
// get the current line
$line = $file->fgets();
// trim it, and then check if its empty
if (empty(trim($line))) {
// skips the current iteration
continue;
}
}
While this may seem like a overkill for such thing, it allows you to do some processing with the empty lines that might come (I had to do this mostly because I needed to count empty lines instead of just skipping them). Since it also trims the line before checking if it's empty, you won't get lines composed only of empty spaces (I don't know if the flags also make it trim the content before checking it).
with php 8.3, with or without SplFileObject::DROP_NEW_LINE, you get an array with empty values at the end.