Re: Re: [RFC-Discuss] Scalar Type Declarations v0.5
| From: | Dmitry Stogov | Date: | Wed, 25 Feb 2015 15:29:26 +0000 |
| Subject: | Re: Re: [RFC-Discuss] Scalar Type Declarations v0.5 | ||
| References: | 1 2 3 4 5 6 7 8 9 10 11 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-83799@lists.php.net to get a copy of this message | ||
On Wed, Feb 25, 2015 at 6:09 PM, Anthony Ferrara <ircmaxell@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
>