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

在回退/下一个时读取。

SplFileObject::SKIP_EMPTY

跳过文件中的空行。这需要启用 READ_AHEAD 标志才能按预期工作。

SplFileObject::READ_CSV

将行读取为 CSV 行。

目录

添加笔记

用户贡献笔记 4 个笔记

Lars Gyrup Brink Nielsen
10 年前
请注意,此类具有一个私有(因此未记录)属性,该属性保存文件指针。结合没有关闭文件句柄的方法这一事实,您将遇到无法使用 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
9 年前
如果您想在读取 CSV 文件时跳过空白行,您需要 *所有 * 标志

$file->setFlags(SplFileObject::READ_CSV | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE);
contact at trimal dot in
4 个月前
使用 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