Re: Re: [RFC-Discuss] Scalar Type Declarations v0.5

From: Date: Wed, 25 Feb 2015 15:09:09 +0000
Subject: Re: Re: [RFC-Discuss] Scalar Type Declarations v0.5
References: 1 2 3 4 5 6 7 8 9 10  Groups: php.internals 
Request: Send a blank email to internals+get-83792@lists.php.net to get a copy of this message
Dmitry, > The object on the call-site should remain to be an object (if it's not > passed by reference), however the called function will receive a string. > It works in PHP-5 and PHP-7. Nothing should be changed. > > $ sapi/cli/php -r 'class X {function __toString(){return "abc";}} $x=new X; > var_dump(strlen($x)); var_dump($x);' > int(3) > object(X)#1 (0) { > } > > However, declare(strict_types=1) will break this. see > > https://github.com/ircmaxell/php-src/compare/scalar_type_hints_v5#diff-ef5bf53d1412b50f85d125ca4fe84741R1182 "Break" is a loaded term. It's intentionally not calling __toString, because that's not only a cast (like "5" -> int(5)), but it's a lossy cast (like 5.5 -> int(5) or "5 apples" => int(5)). One point of strict mode is that it's there intentionally to turn off magic. It's there to make things explicit, predictable and robust. And it's fully opt-in, so there's nothing to "break". It's entirely new behavior. Anthony

« previous php.internals (#83792) next »