PHP Conference Japan 2024

SplFileObject 类

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

简介

SplFileObject 类提供了一个面向对象的接口来操作文件。

类概要

class SplFileObject extends SplFileInfo implements RecursiveIterator, SeekableIterator {
/* 常量 */
public const int DROP_NEW_LINE;
public const int READ_AHEAD;
public const int SKIP_EMPTY;
public const int READ_CSV;
/* 方法 */
public __construct(
    string $filename,
    string $mode = "r",
    bool $useIncludePath = false,
    ?resource $context = null
)
public eof(): bool
public fflush(): bool
public fgetc(): string|false
public fgetcsv(string $separator = ",", string $enclosure = "\"", string $escape = "\\"): array|false
public fgets(): string
public fgetss(string $allowable_tags = ?): string
public flock(int $operation, int &$wouldBlock = null): bool
public fpassthru(): int
public fputcsv(
    array $fields,
    string $separator = ",",
    string $enclosure = "\"",
    string $escape = "\\",
    string $eol = "\n"
): int|false
public fread(int $length): string|false
public fscanf(string $format, mixed &...$vars): array|int|null
public fseek(int $offset, int $whence = SEEK_SET): int
public fstat(): array
public ftell(): int|false
public ftruncate(int $size): bool
public fwrite(string $data, int $length = 0): int|false
public getChildren(): null
public getFlags(): int
public getMaxLineLen(): int
public hasChildren(): false
public key(): int
public next(): void
public rewind(): void
public seek(int $line): void
public setCsvControl(string $separator = ",", string $enclosure = "\"", string $escape = "\\"): void
public setFlags(int $flags): void
public setMaxLineLen(int $maxLength): void
public __toString(): string
public valid(): bool
/* 继承的方法 */
public SplFileInfo::getBasename(string $suffix = ""): string
public SplFileInfo::openFile(string $mode = "r", bool $useIncludePath = false, ?resource $context = null): SplFileObject
public SplFileInfo::setFileClass(string $class = SplFileObject::class): void
public SplFileInfo::setInfoClass(string $class = SplFileInfo::class): void
}

预定义常量

SplFileObject::DROP_NEW_LINE

在读取行时丢弃行尾的换行符。

SplFileObject::READ_AHEAD

在 rewind() 或 next() 时预读下一行。

SplFileObject::SKIP_EMPTY

跳过文件中空行。此功能需要 READ_AHEAD 标志启用才能正常工作。

SplFileObject::READ_CSV

将行读取为 CSV 行。

目录

添加注释

用户贡献的注释 4 条注释

Lars Gyrup Brink Nielsen
11 年前
请注意,此类具有一个私有(因此未记录)属性,该属性保存文件指针。结合这样一个事实,即没有方法可以关闭文件句柄,您就会遇到无法使用 unlink() 等删除文件的情况,因为 SplFileObject 仍然存在一个打开的句柄。

要解决此问题,请像这样删除 SplFileObject

---------------------------------------------------------------------
<?php
print "声明文件对象\n";
$file = new SplFileObject('example.txt');

print
"尝试删除文件...\n";
unlink('example.txt');

print
"关闭文件对象\n";
$file = null;

print
"删除文件...\n";
unlink('example.txt');

print
'文件已删除!';
?>
---------------------------------------------------------------------

这将输出

---------------------------------------------------------------------
声明文件对象
尝试删除文件...

警告:unlink(example.txt):权限被拒绝,位于 file.php 的第 6 行
关闭文件对象
删除文件...
文件已删除!
---------------------------------------------------------------------
marcus at synchromedia dot co dot uk
10 年前
如果要读取 CSV 文件时跳过空行,则需要 *所有* 标志

$file->setFlags(SplFileObject::READ_CSV | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE);
contact at trimal dot in
8 个月前
使用 php 8.3,无论是否使用 SplFileObject::DROP_NEW_LINE,您都会得到一个数组,其中在末尾包含空值。
rlazarotto15+dont+spam+me at gmail dot com
3 年前
补充 marcus at synchromedia dot co dot uk 的评论,您也可以这样做

<?php

// 创建一个用于读取的 SplFileObject - 请注意没有标志
$file = new SplFileObject('/path/to/file', 'r');

// 遍历其内容
while (!$file->eof()) {
// 获取当前行
$line = $file->fgets();

// 修剪它,然后检查它是否为空
if (empty(trim($line))) {
// 跳过当前迭代
continue;
}
}

虽然
这对于 这样 的事情来说可能显得有点过头了但它允许您 可能出现的空行进行一些处理我必须 这样做,主要是因为我需要计算 空行,而不仅仅是跳过它们)。由于它在检查 是否为空之前也会修剪该行因此您不会得到仅由 格组成的行我不知道这些标志是否也会在检查之前修剪内容)。
To Top