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" <ma...@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 > -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php