On Sat, Aug 2, 2025, 17:10 Rob Landers <rob@bottled.codes> wrote:

>
>
> On Sat, Aug 2, 2025, at 16:04, Alexandru Pătrănescu wrote:
>
>
>
> On Sat, Aug 2, 2025 at 12:10 PM Rob Landers <rob@bottled.codes> wrote:
>
>
> On Tue, Jul 29, 2025, at 20:11, Jonathan Vollebregt wrote:
>
> I came across this edge case today:
>
> https://3v4l.org/R3Q8D
>
> Both psalm and phpstan think this code is A-OK (Once you add the
> requisite type hints) but it causes fatal errors way back to PHP 5.0.0
>
> ...<snip>...
>
>
> It's not an edge case, in C2, you redefine a protected variable with the
> same name and shadowed the original $v. That $v is different than C's $v.
> It's easiest to see this with static access:
> https://3v4l.org/0SRWb#v8.4.10
>
> However, I don't know of any way to unshadow a property from $this to
> access the ancestor's value (other than using private access), but it
> exists and takes up memory; just accessing it is the hard part.
>
> — Rob
>
>
>
> Hi Rob,
>
> I'm pretty sure that there is no shadowing happening in the example.
> When the child instance is created, there is just one slot for the
> property, as the child one replaces the parent one.
> So basically the child property overrides the parent property rather than
> shadowing it.
>
> True shadowing (two slots) only occurs when the parent property is
> declared private.
>
> It's just that when redefining, it stores the declaring class, and so
> there is this sibling class access issue.
>
> I'm wondering now if the access shouldn't be relaxed, in case we have the
> parent class that initially defined the property.
>
> Of course, we should focus on non-static properties, as static ones are
> different things, and there is some shadowing there.
>
> --
> Alex
>
>
> Hi Alex,
>
> I’m not sure what you mean? https://3v4l.org/WKILh#v8.4.10
>
> There is clearly shadowing going on.
>
>
Hi Rob,

As I said, let's leave aside the static case, as the question from Jonathan
was not about that.

Given the class P that defines a protected property with value 1,
and a class C that extends P and re-defines the protected property with the
value 2,
please show me an example where you could get from an instance of class C
the value 1 of the parent class property that you think it's shadowed.
Bonus point, if you manage that, you could also set it to something else,
and so have a hidden storage for any object of class C that is not really
visible normally.

As far as I know, there is no way to achieve that, and the reason is
because at runtime the objects have a single slot for the protected
property; the child class property overrides the parent class property when
redeclared, and does not shadow it.
But please prove me wrong.


Thanks,
Alex

Reply via email to