|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2015-10-26 13:10 UTC] phplists at stanvassilev dot com
Description:
------------
A "magic property" call into __get shouldn't trigger nested __get, but in some cases it does - namely, when you do isset on an array key of a non-existing property.
This is not a new behavior for PHP 7, PHP 5.6 also does this. But it's undesirable in general.
Test script:
---------------
class Abc {
function __get($name) {
echo $name . ", ";
if (isset($this->shallow)); // Doesn't trigger __get.
if (isset($this->deep['foo'])); // Triggers __get with name "deep".
return 'value';
}
}
$abc = new Abc();
echo $abc->trigger; // Produces output: trigger, deep, value.
Expected result:
----------------
It's expected isset() checks in __get won't produce nested __get calls in the same object (the "deep" part of the output shouldn't exist).
Actual result:
--------------
Nested calls of __get occur.
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Thu Nov 06 21:00:02 2025 UTC |
I was also surprised that the "recursive call" circuit-breaker flag is name-specific, which doesn't allow me to do this: class Foo { function __set($name, $value) { $this->{$name . '_was_set'} = $value; } } $f = new Foo; $f->x = 123; // Out of memory error... I feel that simply disallowing magic methods inside a magic methods without tracking *what name* they're handling would be simpler, and faster in the runtime, right? Why can't it be implemented this way.