Doc #72234 [Com]: Calling foreach on non-array is ignored
| From: | nickdnk at hotmail dot com | Date: | Tue, 17 May 2016 23:34:35 +0000 |
| Subject: | Doc #72234 [Com]: Calling foreach on non-array is ignored | ||
| References: | 1 | Groups: | php.doc.bugs |
| Request: | Send a blank email to doc-bugs+get-13455@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=72234&edit=1
ID: 72234
Comment by: nickdnk at hotmail dot com
Reported by: nickdnk at hotmail dot com
Summary: Calling foreach on non-array is ignored
Status: Not a bug
Type: Documentation Problem
Package: Scripting Engine problem
Operating System: Windows
PHP Version: 7.0.6
Block user comment: N
Private report: N
New Comment:
Okay, fair enough. I'll see if I can provide something to the documentation to make this more
clear to everyone.
Previous Comments:
------------------------------------------------------------------------
[2016-05-17 23:29:01] requinix@php.net
It's fine that you don't want to iterate over regular objects. I don't do it either;
I'd probably use an array or implement Iterator/IteratorAggregate instead. But just because we
don't do it doesn't mean other people do not.
foreach supports objects. That will not change anytime soon. If you want to change it then you need
to use the RFC process. https://wiki.php.net/rfc/howto
If instead you think of a way to clarify what's written in the documentation, I've already
told you about the Edit link. Otherwise there is nothing to do here.
------------------------------------------------------------------------
[2016-05-17 23:15:57] nickdnk at hotmail dot com
I don't know how to edit the documentation to alleviate this problem as I don't know when
or why you'd ever knowingly use foreach on a non-array object, hence the original bug report.
Consider the following:
class SomeClass {
private $anArray;
public function getArray() {
return $this->anArray;
}
}
I left out constructor etc, but assume the private variable contains a valid array, that our class
has been instantiated and that it is referenced by a variable, let's call it $ourClass.
Now somewhere in our code we *accidentally* do this:
foreach ($ourClass as $anObject) {
*do something with $anObject*
// Nothing happens
}
Instead of the correct approach:
foreach ($ourClass->getArray() as $anObject) {
*do something with $anObject*
// Something happens
}
Now our code silently fails. I realize this is a programmer's error, but are warnings and such
not meant to help us avoid errors that are *always* errors? That's why I wanted an example of
when the first approach is ever sensible, as in; is it ever not an error? If not, why not warn the
user that he is doing something senseless? If yes, please provide an example. Or does it have
something to do with speed - as in having to check for this every time foreach is used?
Thanks :)
------------------------------------------------------------------------
[2016-05-17 22:39:49] requinix@php.net
If you have ideas on how to make the documentation more clearly indicate that foreach does, in fact,
work on objects then feel free to hit the Edit link in the top-right corner of the page and submit
whatever changes you think are necessary.
------------------------------------------------------------------------
[2016-05-17 22:29:54] nickdnk at hotmail dot com
But, the link clearly states (for the first form, which is what I used as example): "It [The
first form] loops over the *array* given by *array_expression*. On each iteration, the value of the
current element is assigned to $value..."
- when not iterating an array, why are we not seeing at least a warning? Would there ever be a
situation where you'd legitimately use foreach on a non-array object? If so please enlighten
me. Not a single one of the examples in the documentation for foreach use a non-array object.
------------------------------------------------------------------------
[2016-05-17 20:33:12] requinix@php.net
foreach on an object is allowed. You aren't seeing anything because the $obj is empty.
http://php.net/manual/en/control-structures.foreach.php
https://3v4l.org/CCrFo
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
https://bugs.php.net/bug.php?id=72234
--
Edit this bug report at https://bugs.php.net/bug.php?id=72234&edit=1