次のテキスト ファイルを検討してくださいtest.txt
。
1
2
3
そして、次の PHP コード:
<?php
$file = new SplFileObject('test.txt', 'r');
var_dump($file->key());
$line = $file->fgets();
var_dump($file->key());
$line = $file->fgets();
var_dump($file->key());
$line = $file->fgets();
var_dump($file->key());
$line = $file->fgets();
var_dump($file->key());
以下を出力します。
int(0) int(0) int(1) int(2) int(3)
ご覧のとおり、 key は への最初の呼び出しの前後で等しく 0fgets()
です。なんで?それは意図されていますか?バグですか?
動作は同じ設定SplFileObject::READ_AHEAD
フラグです。
私は使用していますPHP 5.3.10-2
ありがとうございました!
編集
SplFileObject
ソースコードを見ると、これはバグだと思います。
メソッドkey()
は行番号を返すだけです:
293 /**
294 * @return line number
295 * @note fgetc() will increase the line number when reaing a new line char.
296 * This has the effect key() called on a read a new line will already
297 * return the increased line number.
298 * @note Line counting works as long as you only read the file and do not
299 * use fseek().
300 */
301 function key()
302 {
303 return $this->lnum;
304 }
lnum
インスタンス変数に格納され、ゼロに初期化されます。
26 private $lnum = 0;
新しいインスタンスを作成すると、何も起こらないように見えるlnum
ため、作成後も値は 0 のままである必要があります。
32 /**
33 * Constructs a new file object
34 *
35 * @param $file_name The name of the stream to open
36 * @param $open_mode The file open mode
37 * @param $use_include_path Whether to search in include paths
38 * @param $context A stream context
39 * @throw RuntimeException If file cannot be opened (e.g. insufficient
40 * access rights).
41 */
42 function __construct($file_name, $open_mode = 'r', $use_include_path = false, $context = NULL)
43 {
44 $this->fp = fopen($file_name, $open_mode, $use_include_path, $context);
45 if (!$this->fp)
46 {
47 throw new RuntimeException("Cannot open file $file_name");
48 }
49 $this->fname = $file_name;
50 }
次に、への呼び出しはfgets
、初回を含めて常に1 ずつ増加する必要がlnum
ありますが、これは起こっていることではありません。
60 /** increase current line number
61 * @return next line from stream
62 */
63 function fgets()
64 {
65 $this->freeLine();
66 $this->lnum++;
67 $buf = fgets($this->fp, $this->max_len);
68
69 return $buf;
70 }
freeline
メソッドは、別の変数を NULL に設定しているだけです。
編集 2
PHP チームにバグを報告しました: https://bugs.php.net/bug.php?id=61523