There was a previous discussion on the return value of
SplFileObject::__toString being
an alias to SplFileObject::current() but that was about the design decision
why and not
really suggesting any kind of change or a technical error. In the
discussion it was
established that:

(1) Changing this would be a BC break
(2) It isn't really a bug in the codebase, the docs were just wrong

The current implementation has a bug in that current() can potentially
return false, if
false is returned from the __toString() magic method a catchable fatal
error occurs.

Code ran on 5.4.11 *nix, Apache 2.2

--TEST--
Ensuring we get appropriate output for SplFileObject::__toString
--FILE--
<?php

$file = fopen('file.txt', 'w');
fwrite($file, 'A');
fclose($file);

$FileObject = new SplFileObject('file.txt');
foreach ($FileObject as $line) {
    echo $FileObject;
}

echo $FileObject;
?>
--EXPECTF--
A


---------
Diff

002+ Catchable fatal error: Method SplFileObject::__toString() must return
a string value
in /path/to/splfileobject_tostring.php on line 12

---------

I would say that SplFileObject:__toString() being an alias to
SplFileObject::current()
makes the use cases for the method very limited and that the current
implementation is
mistaken in returning current(). I can think of no use case where
SplFileObject::__toString()
should return this value. If need to get the current line you're probably
iterating and in
that case should be using foreach() and don't really need to manually take
care of that.
Even if there is a use case for manually invoking
`SplFileObject::current()` you probably
aren't casting a string in that situation and a more expressive method call
is better.

(1) Leave the implementation the way it is and simply return a blank string
when
current() would return false

(2) Change the implementation to return SplFileInfo::__toString()

(3) Change the implementation to return entire file contents

(4) Return some other unthought of string but remains consistent and logical

I am personally partial to (2) or (3) perhaps in 5.5 but (1) could probably
happen
sooner? Thoughts?

Reply via email to