On Wed, Feb 25, 2015 at 6:09 PM, Anthony Ferrara <ircmax...@gmail.com> wrote:
> 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. > OK. it's a BC break. What is the reason for __toString() if it's not going to be called. > > 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)). > this is about conversion rules that may be safe or not. > 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. > turn off magic to get what? Need to write explicit (int) or (string)? We have a number of such patterns that hide errors even in PHP sources (in C). Thanks. Dmitry. > And it's fully opt-in, so there's nothing to "break". It's entirely > new behavior. Anthony >