Bug #78904 [Com]: Uninitialized property triggers __get()

From: Date: Mon, 20 Jan 2020 13:19:21 +0000
Subject: Bug #78904 [Com]: Uninitialized property triggers __get()
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-225006@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=78904&edit=1

 ID:                 78904
 Comment by:         andrzej dot heczko at gmail dot com
 Reported by:        public at grik dot net
 Summary:            Uninitialized property triggers __get()
 Status:             Closed
 Type:               Bug
 Package:            *General Issues
 PHP Version:        7.4.0
 Assigned To:        nikic
 Block user comment: N
 Private report:     N

 New Comment:

Thank you for reply.

By doing unset first I have to explicitly put all the unset thing in constructor. In my opinion,
this comes with time and resource penalty and makes code less readable.

Before fix (7.4.0):
class A {
  use GetMagicTrait;

  private Foo $a;
  private Bar $b;
  private Baz $z;
}

After fix (7.4.1+):
class A {
  use GetMagicTrait;

  private Foo $a;
  private Bar $b;
  private Baz $z;

  function __construct()
  {
    unset($this->$a, $this->b, $this->z);
  }
}

Anyway I have read the rfc for typed properties briefly and if I understand it correctly, this fix
breaks it starting with section https://wiki.php.net/rfc/typed_properties_v2#uninitialized_and_unset_properties.

I would like to explain, what I want to achieve.
As of php7.4 not nullable typed properties can have 3 different states:

1. Not Initialized
2. Not Set (Initialized)
3. Set (Initialized)

So whenever I use unset I'm making its state unset (2) and __get is working.
Problem is, we cannot define typed property as unset, only "Not Initialized" or
"Initialized"

I would like to be able to define unset state at the property instead of "Not
Initialized". This would avoid using explicit unset in constructors.

I like typescript ! operator so final property definition could use one of:

class A {
  use GetMagicTrait;

  private Foo $a!;
  private Bar! $b;
  private ! Baz $z;
  private unset Bay $f;
}

where "private unset Foo $a" could be equivalent to shorter use with !.

Can I write RFC for this?
Are there any guidelines for RFCs?
What timeline could be expected for implementation?


Previous Comments:
------------------------------------------------------------------------
[2020-01-17 10:04:24] nikic@php.net

@andrzej: Lazy property initialization is still supported and used by ProxyManager for example. To
lazily initialize both typed and untyped properties, you must unset() them in the constructor.

------------------------------------------------------------------------
[2020-01-17 09:57:06] andrzej dot heczko at gmail dot com

I was experimenting with this behavior to allow lazy property initialization. For instance I can
lazy load services in controllers. Now there is no other option, how to allow lazy initialize
property. I have to stick back to annotations and dynamic properties.

You could add another magic method to allow that e.g. "__init",
"__initProperty", "__getStrict", "__getTyped", etc. which would
respect access modifiers.

You can see all my efforts in composer package bigbit/oddin. 
Version 1.* is using annotations and dynamic properties, version 2.* is using typed properties and
__get.

------------------------------------------------------------------------
[2019-12-09 07:43:01] nikic@php.net

Automatic comment on behalf of nikita.ppv@gmail.com
Revision: http://git.php.net/?p=php-src.git;a=commit;h=84354c62b37a56816a695b18ebd898f9703a9ad2
Log: Fixed bug #78904: Don't call any magic for uninitialized typed properties

------------------------------------------------------------------------
[2019-12-06 15:32:10] public at grik dot net

Thank you. Sorry for filling this ticket up improperly, I did not expect attention.

------------------------------------------------------------------------
[2019-12-06 14:47:19] nikic@php.net

The following pull request has been associated:

Patch Name: Also don't call other magic for uninitialized typed properties
On GitHub:  https://github.com/php/php-src/pull/4974
Patch:      https://github.com/php/php-src/pull/4974.patch

------------------------------------------------------------------------


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=78904


--
Edit this bug report at https://bugs.php.net/bug.php?id=78904&edit=1


Thread (14 messages)

« previous php.bugs (#225006) next »