fopen
・fgets
などの関数からSplFileObject
に乗り換えてきてはまった罠。
バグレポート出してやろうかと思ったけど、マニュアルよく読んでみたら仕様っぽいので我慢。
「そんなの知ってるがなw」って思った人にはごめんなさい。
Code
// empty.txtは0バイトのファイル
$fp = fopen("empty.txt", "r");
var_dump(
feof($fp),
fgets($fp),
feof($fp)
);
fclose($fp);
$file = new SplFileObject("empty.txt", "r");
var_dump(
$file->eof(),
$file->fgets(),
$file->eof()
);
Expected Result
bool(false) bool(false) bool(true) bool(false) bool(false) bool(true)
Actual Result
bool(false) bool(false) bool(true) bool(false) string(0) "" bool(true)
びっくりしすぎてパソコンに向かって
「ハアアアアアアアアアアアア????????????????」
って叫んだ。
つまりだな・・・それぞれこういう書き方がお作法だということだ。
手続き型
if ($fp = @fopen("data.txt", "r")) {
$i = 0;
while (false !== $tmp = fgets($fp)) {
printf("%d行目: %s", ++$i, $tmp);
}
if (!feof($fp)) {
echo "えふげっつえらー\n";
}
fclose($fp);
} else {
echo "えふーおーぷんえらー\n";
}
オブジェクト指向型
try {
$file = new SplFileObject("data.txt", "r");
$i = 0;
while (!$file->eof() and "" !== $tmp = $file->fgets()) {
printf("%d行目: %s", ++$i, $tmp);
}
} catch (Exception $e) {
echo $e->getMessage() . PHP_EOL;
}
・・・やっぱSplFileObjectのマニュアルがおかしい。
$file = new SplFileObject("file.txt");
while (!$file->eof()) {
echo $file->fgets();
}
さすがにこれは混乱を招くだろ。