Repository navigation
Stdlib: SplFileObject / SplFileInfo — SPL file iteration OOP (ext/spl parity) #3293
Copy link
Copy link
Closed
Labels
area:vmVirtual machineVirtual machineenhancementNew feature or requestNew feature or requestimplementation-readySpec complete: repro, php-src ref, done-when — safe for workers to claimSpec complete: repro, php-src ref, done-when — safe for workers to claimphase-4:stdlibPhase 4 – stdlib for web appsPhase 4 – stdlib for web apps
Description
Category
stdlib
Problem
Zend exposes SplFileInfo and SplFileObject for object-oriented file access and iteration (foreach ($file as $line)). PurHur has procedural stream builtins (fopen, fgets, …) but no SPL file classes — class_exists('SplFileObject') is false.
Verified on master:
./script/docker-exec.sh -- bash -lc 'source script/php-env.sh && php bin/vm.php -r "var_dump(class_exists(\"SplFileObject\"), class_exists(\"SplFileInfo\"));"'
# bool(false) bool(false)php-src reference
ext/spl/spl_directory.c—SplFileInfometadata (getPathname,getSize,isDir, …)ext/spl/spl_file_object.c—SplFileObjectextendsSplFileInfo, implementsRecursiveIterator/SeekableIteratorext/spl/spl_iterators.c— iterator protocol forforeachext/standard/streams.c— underlyingphp_streamlayer (reuse existing VM stream resources)
Repro
<?php
file_put_contents('/tmp/spl-test.txt', "a\nb\nc\n");
$fo = new SplFileObject('/tmp/spl-test.txt');
foreach ($fo as $i => $line) {
echo $i, ':', trim($line), "\n";
}
$info = new SplFileInfo('/tmp/spl-test.txt');
echo $info->getSize(), "\n";./script/docker-exec.sh -- bash -lc 'source script/php-env.sh && php bin/vm.php repro.php'
php repro.phpZend PHP: 0:a, 1:b, 2:c, then file size.
This compiler: unknown class SplFileObject.
Scope (this repo)
| Area | Path | Notes |
|---|---|---|
| New ext | ext/spl/ module |
Register classes + methods |
| VM | lib/VM.php, iterator ops |
Wire foreach over object implementing iterator protocol (#3234 Traversable) |
| Streams | existing ext/standard stream layer |
SplFileObject wraps FILE* resource |
| Tests | test/compliance/cases/stdlib/spl_file_object*.phpt |
|
| Matrix | script/capability-matrix.php |
v1 methods: SplFileObject::__construct, current, key, next, rewind, valid, eof, fgets, fgetcsv, seek, getFilename; SplFileInfo::getPathname, getSize, isFile, isDir. Defer: RecursiveDirectoryIterator, flock, SplTempFileObject.
Done when
- Repro foreach +
getSize()match Zend -
foreach ($splFile as $line)uses Traversable path (Language: foreach over Traversable / Iterator objects (Zend parity) #3234) - Compliance PHPT(s) green on VM
- Capability matrix documents SPL classes (VM-only OK for v1)
Verification
./script/docker-exec.sh -- bash -lc 'source script/php-env.sh && vendor/bin/phpunit --filter SplFile'Links
- Traversable foreach: Language: foreach over Traversable / Iterator objects (Zend parity) #3234
- Stream layer: Stdlib: stream_get_meta_data / stream_set_blocking — stream introspection (ext/standard/streams.c parity) #3237, Stdlib: stream_copy_to_stream() — copy bytes between streams (ext/standard/streams.c parity) #3272
- North star: Epic: Self-host critical path — compiler compiles itself (M3→M5) #1492
Metadata
Metadata
Assignees
Labels
area:vmVirtual machineVirtual machineenhancementNew feature or requestNew feature or requestimplementation-readySpec complete: repro, php-src ref, done-when — safe for workers to claimSpec complete: repro, php-src ref, done-when — safe for workers to claimphase-4:stdlibPhase 4 – stdlib for web appsPhase 4 – stdlib for web apps
Activity
PurHur commentedon Jun 7, 2026
Duplicate of #6393 (newer spec with ext/spl paths, repro script, and done-when). Workers: claim #6393.