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

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to