> -----Original Message-----
> From: Anthony Ferrara [mailto:ircmax...@gmail.com]
> Sent: Saturday, February 21, 2015 8:12 PM
> To: Zeev Suraski
> Cc: PHP internals
> Subject: Re: [PHP-DEV] Coercive Scalar Type Hints RFC
>
> Zeev,
>
> First off, thanks for putting forward a proposal. I look forward to a
> patch
> that can be experimented with.
>
> There are a few concerns that I have about the proposal however:
>
> > Proponents of Strict STH cite numerous advantages, primarily around code
> safety/security. In their view, the conversion rules proposed by Dynamic
> STH
> can easily allow ‘garbage’ input to be silently converted into arguments
> that
> the callee will accept – but that may, in many cases, hide
> difficult-to-find
> bugs or otherwise result in unexpected behavior.
>
> I think that's partially mis-stating the concern.

I don't think it is, based
It's less about "garbage input"
> and more about unpredictable behavior. You can't look at code and know
> that it will not produce an error with dynamic typing. That's one of the
> big
> advantages of strict typing that many people want. In reality the reasons
> are
> complex, varied and important to each person.



>
> > Proponents of Dynamic STH bring up consistency with the rest of the
> language, including some fundamental type-juggling aspects that have been
> key tenets of PHP since its inception. Strict STH, in their view, is
> inconsistent
> with these tenets.
>
> Dynamic STH is apparently consistency with the rest of the language's
> treatment of scalar types. It's inconsistent with the rest of the
> languages
> treatment of parameters.
>
> However there's an important point to make here: a lot of best practice
> has
> been pushing against the way PHP treats scalar types in certain cases.
> Specifically around == vs === and using strict comparison mode in
> in_array,
> etc.
>
> So while it appears consistent with the rest of PHP, it only does so if
> you
> ignore a large part of both the language and the way it's commonly used.
>
> In reality, the only thing PHP's type system is consistent at is being
> inconsistent.
>
>
>
> In the "Changes To Internal Functions" section, I think all three types
> are
> significantly flawed:
>
> 1. "Just Do It" - This is problematic because a very large chunk of code
> that
> worked in 5.x will all of a sudden not work in 7.0. This will likely
> create a
> python 2/3 issue, as it would require a LOT of code to be changed to make
> it
> compatible.
>
> 2. "Emit E_DEPRECATED" - This is problematic because raising errors (even
> if
> suppressed) is not cheap. And the potential for raising one for a
> non-trivial
> percentage of every native function call has the potential to have a
> MASSIVE
> performance impact for code designed for 5.x. Without a patch to test, it
> can't really be codified, but it would be a shame to lose the performance
> gains made with 7 because we're triggering 100's, 1000's or 10000's of
> errors
> in a single application run...
>
> 3. "Just Do It but give users an option to not" - This has the problems
> that
> E_DEPRECATED has, but it also gets us back to having fundamental code
> behavior controlled by an INI setting, which for a very long time this
> community has generally seen as a bad thing (especially for portability
> and
> code re-use).
>
>
>
> Moving along,
>
> > Further, the two sets can cause the same functions to behave
> > differently depending on where they're being called
>
> I think that's misleading. The functions will always behave the same.
> The difference is how you get data into the function. The behavior
> difference
> is in your code, not the end function.
>
> > For example, a “32” (string) value coming back from an integer column in
> > a
> database table, would not be accepted as valid input for a function
> expecting
> an integer.
>
> There's an important point to consider here. You're relying on information
> outside of the program to determine program correctness.
> So to say "coming back from an integer column" requires concrete
> knowledge and information that you can't possibly have in the program.
> What happens when some DBA changes the column type to a string type.
> The data will still work for a while, but then suddenly break without
> warning
> when a non-integer value comes in. Because the value-information comes
> from outside.
>
> With strict mode, you'd have to embed a cast (smart or explicit) to
> convert to
> an integer at the point the data comes in. So semantic information about
> the
> value is places right at the point of entry (forcing the code to be more
> explicit
> and clear).
>
> Additionally, with the dual-mode proposal DB interactions can be in weak
> mode and have the exact behavior you're describing here. Giving the user
> the
> choice, rather than making assumptions.
>
> > Strict zval.type based STH effectively eliminates this behavior, moving
> > the
> burden of worrying about type conversion to the user.
>
> Correct. And you say that as if it's a bad thing. Being explicit about
> type
> conversions isn't what you'd do in a 10 line-of-code script where you can
> realize what the types are by just thinking about it. But on large scale
> systems
> exposing the type conversions to the user gives the power to actually
> understand the codebase when you can't fit the whole thing in your head at
> the same time.
>
> So what you cite here as a disadvantage many consider to be an advantage.
>
> > Performance
>
> I find it funny how the non-strict crowd keeps bringing up performance...
>
> > It is our position that there is no difference at all between strict
> > and coercive typing in terms of potential future AOT/JIT development -
> > none at all
>
> So really what you're saying is that you disagree with me publicly. A
> statement which I said on the side, and I said should not impact RFC or
> voting
> in any way. And is in no part in my RFC at all. Yet brought up again.
>
> > Static Analysis. It is the position of several Strict STH proponents
> > that Strict STH can help static analysis in certain cases. For the
> > same reasons mentioned above about JIT, we don't believe that is the
> > case
>
> This is patently false. Keep not believing it all you want, but *static
> analysis*
> requires statically looking at code. Which means you have no value
> information. So static analysis can't possibly happen in cases where you
> need
> to know about value information (because it's not there). Yes, at function
> entry you know the types. But static analysis isn't about analyzing a
> single
> function (in fact, that's the least interesting case). It's more about
> analyzing a
> series of functions, a function call graph. And in that case strict typing
> (based
> only on
> type) does make a big difference.
>
>
>
> In short, I think the concerns around the handling of internal functions
> is
> significant enough to cause major concern about this proposal.
>
> Thanks
>
> Anthony
>
> On Sat, Feb 21, 2015 at 12:22 PM, Zeev Suraski <z...@zend.com> wrote:
> > All,
> >
> >
> >
> > I’ve been working with François and several other people from
> > internals@ and the PHP community to create a single-mode Scalar Type
> Hints proposal.
> >
> >
> >
> > I think it’s the RFC is a bit premature and could benefit from a bit
> > more time, but given the time pressure, as well as the fact that a not
> > fully compatible subset of that RFC was published and has people
> > already discussing it, it made the most sense to publish it sooner
> > rather than later.
> >
> >
> >
> > The RFC is available here:
> >
> >
> >
> > wiki.php.net/rfc/coercive_sth
> >
> >
> >
> > Comments welcome!
> >
> >
> > Zeev

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

Reply via email to