Hi,

Le 25 févr. 2015 13:31, "Dmitry Stogov" <dmi...@zend.com> a écrit :
>
> anyone may tell, what this will print without running :)
>
> main.php
> ========
> <?php
> declare(strict_types=1)
> include "a.php";
> include "b.php";
> var_dump(foo("5"));
> ?>
>
> a.php
> =====
> <?php
> declare(strict_types=0)
> function foo(string $a): string {
>     bar($a);
>     return $a;
> }
> ?>
>
> b.php
> =====
> <?php
> declare(strict_types=1)
> function bar(int &$a) {
>     var_dump($a);
> }
> ?>

No error. The declare is per-file.

>
> Thank. Dmitry.
>
> On Wed, Feb 25, 2015 at 3:19 PM, Dmitry Stogov <dmi...@zend.com> wrote:
>
> > Hi Anthony,
> >
> > Few notes:
> >
> > - first of all, it would be great to split the voting questions: 2/3 -
> > implement scalar type hinting + 1/2 - in addition add strict type
hinting
> > as you propose. I think, the concept of run-time declare() switch is not
> > designed well. It just affects VM and JITed code in negative way,
because
> > in each function we will have to handle both options
> >
https://github.com/ircmaxell/php-src/compare/scalar_type_hints_v5#diff-3054389ad750ce9a9f5895cd6d27800fR3762
> > and also set additional flag on each call
> >
https://github.com/ircmaxell/php-src/compare/scalar_type_hints_v5#diff-3054389ad750ce9a9f5895cd6d27800fR2802
> > .
> >
> > - resource type hint may be useful in the same way as all other types
> >
> > - it may make sense not to disable bool/int/float/string classes at all.
> > we may just don't allow them in type hints. This will break less
> > applications.
> >
> > Thanks. Dmitry.
> >
> >
> >
> >
> > On Sat, Feb 21, 2015 at 6:35 PM, Anthony Ferrara <ircmax...@gmail.com>
> > wrote:
> >
> >> All,
> >>
> >> I have updated the RFC to re-target 7.0.
> >>
> >> I have also added a new behavior:
> >>
> >> Currently, if you install an error handler that returns true, you can
> >> bypass type checking in userland functions.
> >>
> >> set_error_handler(function() { return true; });
> >> function foo(int $abc) {
> >>     var_dump($abc);
> >> }
> >> foo("test"); // string(4) "test"
> >>
> >> This is obviously a problem for strict typing. Therefore, I am
> >> proposing that strict mode bypass function execution in this case.
> >>
> >> The current proposal for engine exceptions would eliminate the need
> >> for this behavior. Therefore I documented the behavior, but am holding
> >> off on the implementation until the engine exceptions vote concludes
> >> (if it fails, the behavior documented in the RFC would be
> >> implemented).
> >>
> >> Thanks
> >>
> >> Anthony
> >>
> >> On Fri, Feb 20, 2015 at 4:09 PM, Anthony Ferrara <ircmax...@gmail.com>
> >> wrote:
> >> > All,
> >> >
> >> >> An interesting point was brought up related to block mode:
> >> >> https://twitter.com/drrotmos/status/568540722586107904
> >> >>
> >> >> Namely that generated file caches may need the ability to switch
block
> >> >> mode on-and-off.
> >> >>
> >> >> I'm considering making the change to add that. If that happens,
> >> >> declare must be the outermost block, and no non-declare blocks would
> >> >> be allowed in the outermost scope of the file:
> >> >>
> >> >> <?php
> >> >> declare(strict_types=1) {
> >> >>     //...
> >> >> }
> >> >> declare(strict_types=0) {
> >> >>     //...
> >> >> }
> >> >>
> >> >> Having trailing code or code outside of the declare would be a
compile
> >> error.
> >> >>
> >> >> <?php
> >> >> declare(strict_types=1) {
> >> >>     //...
> >> >> }
> >> >> foo(); // compile error
> >> >>
> >> >> This behaves consistent with namespace block-mode today (though the
> >> >> strict type declaration would be required to be outside the
namespace
> >> >> block).
> >> >>
> >> >> I'm considering adding it, as it's a valid use-case. What do you
think?
> >> >
> >> > So, I ran into a snag while doing this.
> >> >
> >> > It turns out that in the parser implementation of declare is not
going
> >> > to allow it without significant restructuring (including a lot of
> >> > validation in the compiler):
> >> >
> >> > declare_statement:
> >> > statement { $$ = $1; }
> >> > | ':' inner_statement_list T_ENDDECLARE ';' { $$ = $2; }
> >> > ;
> >> >
> >> > So in block mode, declare supports inline, block and named-block
mode:
> >> >
> >> > declare(...) foo();
> >> > declare(...) {
> >> >     foo();
> >> > }
> >> > declare(...):
> >> >     foo();
> >> > enddeclare;
> >> >
> >> > The problem with this is that namespace declarations can only happen
> >> > in top_statement (along with some other statements).
> >> >
> >> > That leaves two options to support multiple modes per file:
> >> >
> >> > 1. Allow in top-level only:
> >> >
> >> > declare(strict_types=1);
> >> > namespace Foo {
> >> > }
> >> > declare(strict_types=0);
> >> > namespace Bar {
> >> > }
> >> >
> >> > 2. inside of the namespace:
> >> > namespace Foo {
> >> >     declare(strict_types=1);
> >> > }
> >> > namespace Bar {
> >> > }
> >> >
> >> > The problem with the first is clarity (it's easy to miss a declare
and
> >> > not understand that the mode has changed). We pinned declare to the
> >> > top of the file for clarity. I'm not sure this use-case is worth
> >> > breaking that clarity.
> >> >
> >> > The problem with the second is more subtle. With the current
> >> > parser+compiler, that declare would affect the entire file. It would
> >> > take pretty significant changes and restructuring of the parser to
> >> > effect.
> >> >
> >> > We could drop declare() all together and go with something like a
> >> > namespace modifier:
> >> >
> >> > strict namespace Foo {
> >> > }
> >> > namespace Bar {
> >> > }
> >> >
> >> > But I don't think it's worth it to conflate those two together.
Though
> >> > if we did, the syntax "strict namespace;" would be supported for
> >> > non-namespaced strict code.
> >> >
> >> > So in the end, my conclusion is that while it would be nice to
support
> >> > the "compiled file" use-case fully, it's not worth it from a
technical
> >> > level (the risk and degree of change required doesn't offset the
> >> > benefit of it).
> >> >
> >> > So the proposal will remain unchainged and not support the block
> >> > syntax (or changing the mode mid-file).
> >> >
> >> > Thanks
> >> >
> >> > Anthony
> >>
> >> --
> >> PHP Internals - PHP Runtime Development Mailing List
> >> To unsubscribe, visit: http://www.php.net/unsub.php
> >>
> >>
> >

Cheers,
Florian Margaine

Reply via email to