Bug #53731 [Opn->Csd]: Function arguments can only be changed when native values are given.
| From: | nikic@php.net | Date: | Thu, 28 Dec 2017 17:25:48 +0000 |
| Subject: | Bug #53731 [Opn->Csd]: Function arguments can only be changed when native values are given. | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-213310@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=53731&edit=1
ID: 53731
Updated by: nikic@php.net
Reported by: blue-tidus159 at hotmail dot com
Summary: Function arguments can only be changed when native
values are given.
-Status: Open
+Status: Closed
Type: Bug
Package: Scripting Engine problem
Operating System: Windows 7 x64
PHP Version: Irrelevant
-Assigned To:
+Assigned To: nikic
Block user comment: N
Private report: N
New Comment:
As per previous comment, no longer relevant in PHP 7.
Previous Comments:
------------------------------------------------------------------------
[2015-08-28 13:49:58] nikic@php.net
@requinix: Thanks, I didn't get that this is about type hints. In that case, I guess this is
fixed in PHP 7 by means of it throwing an exception? It doesn't seem like doing this kind of
modification through a direct call to debug_backtrace() is possible: https://3v4l.org/MWE8l
------------------------------------------------------------------------
[2015-08-28 13:34:39] requinix@php.net
I think I have what @blue-tidus159 was trying to show. The key is that the function parameter has a
type hint and the value passed is not an instance of it (thus triggering the error). But it gets a
lot more interesting after that...
https://3v4l.org/7B3jB
Then the comment later seems to be about how it also happens with by-ref parameters.
https://3v4l.org/Vs8lG
On a lighter note, I have been inspired to create this abomination:
https://3v4l.org/5lbf0
------------------------------------------------------------------------
[2015-08-28 11:43:07] nikic@php.net
I can't reproduce this. https://3v4l.org/QI9H8 shows that
across all PHP versions it's not possible to modify the argument via debug_backtrace().
That's the correct behavior -- you aren't supposed to be able to do a modification through
that. If you are able to do changes, that would be a bug.
------------------------------------------------------------------------
[2011-01-13 21:41:51] blue-tidus159 at hotmail dot com
I just realized that a similar effect can be reached by setting the reference mark before the
parameter name. The problem is just that the original object will be changed too.
function a(&$a){
var_dump($a);
}
$test = new A();
var_dump($test); // object A
a($test) // int 1
var_dump($test); // int 1 => this should still be object A, you should create internally a new
reference parameter variable referencing the passed object if you know what i mean.
I know that native values get copied and that there is no problem with overwriting the value. But
objects could be handled like this: if used as parameter value, create a new reference variable
referencing the object, this variable can then be overwritten without changing the original object.
------------------------------------------------------------------------
[2011-01-12 22:09:04] blue-tidus159 at hotmail dot com
Little typo, i meant:
set_error_handler('errorHandler');
------------------------------------------------------------------------
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=53731
--
Edit this bug report at https://bugs.php.net/bug.php?id=53731&edit=1