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);
}
?>

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
>>
>>
>

Reply via email to