Жигaн
Новичок
Проблема с SPL
Система winXP, php5.2.2
Проблема 1
SplFileObject::seek() попытка установить указатель за пределы файлы приводит к попаданию в бесконечный цикл.
ext/spl/spl_directory.c:2359
имхо лучше так:
Проблема 2
Попытка бросить исключение внутри кода который завязан на spl - валит php, к примеру так:
p.s. на bugs.php.net посмотрел, п2 отпадает
Система winXP, php5.2.2
Проблема 1
SplFileObject::seek() попытка установить указатель за пределы файлы приводит к попаданию в бесконечный цикл.
PHP:
<?php
file_put_contents('test.txt', "a\nb\n");
$file = new SplFileObject('test.txt');
// 1 ok
$file->seek(0);
var_dump($file->current()); // "a\n"
// 2 ok
$file->seek(1);
var_dump($file->current()); // "b\n"
// 3 ok
$file->seek(2);
var_dump($file->current()); // ""
if(1) {
// fail
$file->seek(3);
var_dump($file->current()); // ???
}
Код:
/* {{{ proto void SplFileObject::seek(int line_pos)
Seek to specified line */
SPL_METHOD(SplFileObject, seek)
{
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
long line_pos;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &line_pos) == FAILURE) {
return;
}
if (line_pos < 0) {
zend_throw_exception_ex(spl_ce_LogicException, 0 TSRMLS_CC, "Can't seek file %s to negative line %ld", intern->file_name, line_pos);
RETURN_FALSE;
}
spl_filesystem_file_rewind(getThis(), intern TSRMLS_CC);
[b]
while(intern->u.file.current_line_num < line_pos) {
spl_filesystem_file_read_line(getThis(), intern, 1 TSRMLS_CC);
}
[/b]
} /* }}} */
Код:
while(intern->u.file.current_line_num < line_pos) {
if(php_stream_eof(intern->u.file.stream)) {
zend_throw_exception_ex(spl_ce_LogicException, 0 TSRMLS_CC, "Can't seek file %s to beyond of the end", intern->file_name);
RETURN_FALSE;
}
if(SUCCESS != spl_filesystem_file_read_line(getThis(), intern, 1 TSRMLS_CC)) {
zend_throw_exception_ex(spl_ce_LogicException, 0 TSRMLS_CC, "Can't read next line from file %s", intern->file_name);
RETURN_FALSE;
}
}
Попытка бросить исключение внутри кода который завязан на spl - валит php, к примеру так:
PHP:
<?php
class Foo implements IteratorAggregate {
function getIterator() {
throw new Exception('Boo');
//return new ArrayIterator(array(1, 2, 3));
}
}
$foo = new Foo();
var_dump(iterator_to_array($foo));