On 18 August 2019 11:14:52 BST, Nicolas Grekas <nicolas.gre...@gmail.com> wrote:
>Le dim. 18 août 2019 à 11:59, Benjamin Morel <benjamin.mo...@gmail.com>
>a
>écrit :
>
>> Hi Internals, I just noticed the following behaviour:
>>
>>     class A {
>>         public int $a;
>>         public ?int $b;
>>         public ?int $c = null;
>>     }
>>
>>     $a = new A;
>>
>>     var_export(get_object_vars($a));
>>     var_export(get_class_vars('A'));
>>
>> Result:
>>
>>     array (
>>         'c' => NULL,
>>       )
>>     array (
>>       'a' => NULL,
>>       'b' => NULL,
>>       'c' => NULL,
>>     )

>See https://bugs.php.net/78319
>get_class_var() does the most useful thing, thus the correct one to me
>and
>the use cases I have.


This is a nice example of something I said when typed properties were being 
added: "uninitialised" is a new special state, distinct from "non-existent" and 
"null". As such, a non-nullable typed property without default value is 
impossible to represent accurately without having a representation of that 
state.

One rather ugly possiblity in this case would be to have the values returned be 
"uninitialized", so that accessing the array keys was valid, but accessing the 
values gave an Unitialized Value Error. That would be pretty horrible for 
backwards compatibility, though, particularly for get_class_properties, where 
there's no chance for the constructor to run and set up a real value.

Regards,

-- 
Rowan Collins
[IMSoP]

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to