Re: [RFC][Vote] Typed Properties
| From: | Tom Worster | Date: | Thu, 26 May 2016 16:44:19 +0000 |
| Subject: | Re: [RFC][Vote] Typed Properties | ||
| References: | 1 2 3 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-93572@lists.php.net to get a copy of this message | ||
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
>>
>