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;
公開 常數 整數 SKIP_EMPTY;
公開 常數 整數 READ_CSV;
/* 方法 */
公開 __construct(
    字串 $filename,
    字串 $mode = "r",
    布林值 $useIncludePath = false,
    ?資源 $context = null
)
公開 current(): 字串|陣列|false
公開 eof(): 布林值
公開 fflush(): 布林值
公開 fgetc(): 字串|false
公開 fgetcsv(字串 $separator = ",", 字串 $enclosure = "\"", 字串 $escape = "\\"): 陣列|false
公開 fgets(): 字串
公開 fgetss(字串 $allowable_tags = ?): 字串
公開 flock(整數 $operation, 整數 &$wouldBlock = null): 布林值
公開 fpassthru(): 整數
公開 fputcsv(
    陣列 $fields,
    字串 $separator = ",",
    字串 $enclosure = "\"",
    字串 $escape = "\\",
    字串 $eol = "\n"
): 整數|false
公開 fread(整數 $length): 字串|false
公開 fscanf(字串 $format, 混合 &...$vars): 陣列|整數|null
公開 fseek(整數 $offset, 整數 $whence = SEEK_SET): 整數
公開 fstat(): 陣列
公開 ftell(): 整數|false
公開 ftruncate(整數 $size): 布林值
公開 fwrite(字串 $data, 整數 $length = 0): 整數|false
公開 getChildren(): null
公開 getFlags(): 整數
公開 hasChildren(): false
公開 key(): 整數
公開 next():
公開 rewind():
公開 seek(整數 $line):
公開 setCsvControl(字串 $separator = ",", 字串 $enclosure = "\"", 字串 $escape = "\\"):
公開 setFlags(整數 $flags):
公開 setMaxLineLen(整數 $maxLength):
公開 __toString(): 字串
公開 valid(): 布林值
/* 繼承的方法 */
公開 SplFileInfo::getBasename(字串 $suffix = ""): 字串
公開 SplFileInfo::openFile(字串 $mode = "r", 布林值 $useIncludePath = false, ?資源 $context = null): SplFileObject
公開 SplFileInfo::setFileClass(字串 $class = SplFileObject::class):
公開 SplFileInfo::setInfoClass(字串 $class = SplFileInfo::class):
}

預定義常數

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