Re: [RFC][Vote] Typed Properties
| From: | Thomas Bley | Date: | Thu, 26 May 2016 20:08:23 +0000 |
| Subject: | Re: [RFC][Vote] Typed Properties | ||
| References: | 1 2 3 4 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-93586@lists.php.net to get a copy of this message | ||
it's not so magic, rather think of (int)null, (float)null, (string)null, (array)null, etc.
Typed properties could be defined as nullable by default, but I think that makes userland code much
more ugly.
Regards
Thomas
Tom Worster wrote on 26.05.2016 18:44:
> Hi Thomas,
>
> On the face of it, I'm not enthusiastic to introduce new magic numbers
> (which would be false, 0, 0.0, "", and [], right?) that PHP assigns when
> coercing a typed, uninitialized property read by a file in liberal mode.
>
> This is like taking the most confusing thing about 7.0's dual-mode, scalar
> type declaration of function arguments and boosting the confusion power. I
> would want a new name for this complement-of-strict mode. "Weak" and
> "liberal" don't quite do it. Promiscuous mode? ;)
>
> Tom
>
>
> On 5/26/16, 10:40 AM, "Thomas Bley" <mails@thomasbley.de> wrote:
>
>>I think strict_types=1 should give a fatal error for accessing
>>non-initialized typed properties, instead of notice.
>>Example:
>>
>>declare(strict_types=1);
>>
>>class A {
>> public int $x;
>> public ?int $y = null;
>> public int $z = 42;
>> public ?int $u;
>> public ?datetime $v;
>> public datetime $w;
>>}
>>
>>$a = new A;
>>var_dump($a->x); // Fatal error, uninitialized...
>>var_dump($a->y); // null
>>var_dump($a->z); // 42
>>var_dump(isset($a->z)); // true
>>unset($a->z);
>>var_dump(isset($a->z)); // false
>>var_dump($a->z); // Fatal error, uninitialized...
>>var_dump($a->u); // Fatal error, uninitialized...
>>var_dump($a->v); // Fatal error, uninitialized...
>>var_dump($a->w); // Fatal error, uninitialized...
>>
>>var_dump(isset($a->x)); // false
>>var_dump(isset($a->y)); // false
>>var_dump(isset($a->u)); // false
>>var_dump(isset($a->v)); // false
>>var_dump(isset($a->w)); // false
>>
>>Regards
>>Thomas
>>
>>Tom Worster wrote on 26.05.2016 15:53:
>>
>>> On 5/25/16 5:52 PM, Thomas Bley wrote:
>>>> I'm not seeing a problem here:
>>>>
>>>> class A {
>>>> public int $x;
>>>> public ?int $y = null;
>>>> public int $z = 42;
>>>> public ?int $u;
>>>> public ?datetime $v;
>>>> public datetime $w;
>>>> }
>>>>
>>>> $a = new A;
>>>> var_dump($a->x); // 0 + notice
>>>> var_dump($a->y); // null
>>>> var_dump($a->z); // 42
>>>> var_dump(isset($a->z)); // true
>>>> unset($a->z);
>>>> var_dump(isset($a->z)); // false
>>>> var_dump($a->z); // 0 + notice
>>>> var_dump($a->u); // null + notice
>>>> var_dump($a->v); // null + notice
>>>> var_dump($a->w); // Fatal error, uninitialized...
>>>>
>>>> var_dump(isset($a->x)); // false
>>>> var_dump(isset($a->y)); // false
>>>> var_dump(isset($a->u)); // false
>>>> var_dump(isset($a->v)); // false
>>>> var_dump(isset($a->w)); // false
>>>
>>> Is the file containing these examples in liberal mode?
>>>
>>> What changes if declare(strict_types=1) precedes $a = new A;?
>>>
>>> Tom
>>>
>>
>
>
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>