Bug #53731 [Opn]: Function arguments can only be changed when native values are given.
| From: | nikic@php.net | Date: | Fri, 28 Aug 2015 13:50:00 +0000 |
| Subject: | Bug #53731 [Opn]: 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-195596@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
Type: Bug
Package: Scripting Engine problem
Operating System: Windows 7 x64
PHP Version: Irrelevant
Block user comment: N
Private report: N
New Comment:
@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
Previous Comments:
------------------------------------------------------------------------
[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');
------------------------------------------------------------------------
[2011-01-12 22:07:57] blue-tidus159 at hotmail dot com
Description:
------------
The problem with debug_backtrace() is, that only function parameter values which are native types
can be changed, but not if the value is an object.
Test script:
---------------
<?php
function errorHandler($level, $msg){
$debug = debug_backtrace();
$debug[1]['args'][0]='1';
return true;
}
set_error_handler('error');
function a($a){ // E_RECOVERABLE_ERROR
var_dump($a);
}
class A{}
a(1);
a(2);
a(new A());
?>
Expected result:
----------------
int 1
int 1
int 1
Actual result:
--------------
int 1
int 1
object A
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=53731&edit=1