Bug #79435 [Nab]: property assignment via call_user_func is inconsistent
| From: | requinix@php.net | Date: | Mon, 30 Mar 2020 20:42:45 +0000 |
| Subject: | Bug #79435 [Nab]: property assignment via call_user_func is inconsistent | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-226355@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=79435&edit=1
ID: 79435
Updated by: requinix@php.net
Reported by: ikarol at gomel dot iba dot by
Summary: property assignment via call_user_func is
inconsistent
Status: Not a bug
Type: Bug
Package: Scripting Engine problem
Operating System: Windows
PHP Version: 7.2.29
Block user comment: N
Private report: N
New Comment:
> $this is a reference to the calling object
Correct. But it sounds like you're giving $this some sort of magical behavior that doesn't
exist... well, anywhere else.
Once evaluated, meaning when the code containing the "$this" is executed, it doesn't
somehow change its value when used in other places. If you pass it to a global function, the
function won't error because $this is invalid outside of a class. If you return it to some
caller outside of the class, the value won't error because the object it was in is now out of
scope. And if you try to use the value in some other class, you definitely won't get the
"$this" of the second class.
$a = 1;
$b = $a;
$a = 2;
echo $b;
Obviously 1, right? Because $b is not "the $a variable". It's whatever the $a
variable was at the moment it was evaluated.
Same for $this and $testMap. When $a2 or $a3 look at the callback in $testMap, they don't get
"the $this variable", they get whatever the $this variable was at the moment it was
evaluated.
As for your code, check out https://3v4l.org/Hm6kS
Previous Comments:
------------------------------------------------------------------------
[2020-03-30 19:51:07] ikarol at gomel dot iba dot by
According to the docs(https://www.php.net/manual/en/language.oop5.basic.php), $this is a reference
to the calling object. Though, there is a mention of a different behaviour for the static context,
I'm sure it's only related to static(methods and properties), which is a different thing.
Looking at the docs for static
variables(https://www.php.net/manual/en/language.variables.scope.php#language.variables.scope.static),
there is no mention of how $this is treated. As it only mentions that variables are saved by
reference, I think it will be reasonable for someone to expect a special treatment for
$this(considering it's not an ordinary variable, but pseudo-variable)
------------------------------------------------------------------------
[2020-03-30 19:17:30] requinix@php.net
> So it appears that $this is considered a variable
As indicated by the $, yes.
> rather than being resolved dynamically as a reference to the current calling
> object in a context of local static variable
How did you get that impression in the first place? If the documentation suggested so, that needs to
be fixed.
------------------------------------------------------------------------
[2020-03-30 19:03:26] ikarol at gomel dot iba dot by
So it appears that $this is considered a variable rather than being resolved dynamically as a
reference to the current calling object in a context of local static variable.
In my opinion this is not a straightforward behaviour. So $this either needs to be fixed(dynamic
resolution), or this(behaviour) should be documented.
------------------------------------------------------------------------
[2020-03-30 18:23:28] requinix@php.net
$testMap is initialized using the setC/setD methods on $this, which is $a1 at that time.
------------------------------------------------------------------------
[2020-03-30 15:55:55] ikarol at gomel dot iba dot by
Description:
------------
Hi,
so if property assignment is done through call_user_func, it will only work for the first call, but
will fail for all next(see var_dump output in the example).
Also, if I would assign through dynamic method name call ($this->{$methodName}($prop)), it will
work fine.
Test script:
---------------
https://3v4l.org/ta03s
Expected result:
----------------
All instances of A class should have defined(not-null)C properties
Actual result:
--------------
Only the first instance of A class has it defined, while other do not.
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=79435&edit=1