Doc #72234 [Com]: Calling foreach on non-array is ignored

From: Date: Tue, 17 May 2016 23:15:59 +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-13453@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: 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 :) Previous Comments: ------------------------------------------------------------------------ [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 ------------------------------------------------------------------------ [2016-05-17 20:13:06] nickdnk at hotmail dot com Description: ------------ Hello If passing a variable (let's say a stdClass) to the foreach method, it does not produce an error. It silently does not loop the object (since it cannot). I'm no expert, but I'd say that at least a warning should be raised if trying to iterate a non-array object. I'm sorry if this is intentional, but I do believe an error was raised in 5.6. Test script: --------------- $obj = new stdClass(); foreach ($obj as $anObj) { error_log("nothing is output here, obviously, but no error either"); } Expected result: ---------------- I expect an error or warning to occur, since I'm traversing a non-array. Actual result: -------------- Nothing happens at all. ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=72234&edit=1

« previous php.doc.bugs (#13453) next »