Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:83775 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 24198 invoked from network); 25 Feb 2015 12:30:37 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 25 Feb 2015 12:30:37 -0000 Authentication-Results: pb1.pair.com header.from=dmitry@zend.com; sender-id=pass Authentication-Results: pb1.pair.com smtp.mail=dmitry@zend.com; spf=pass; sender-id=pass Received-SPF: pass (pb1.pair.com: domain zend.com designates 209.85.220.169 as permitted sender) X-PHP-List-Original-Sender: dmitry@zend.com X-Host-Fingerprint: 209.85.220.169 mail-vc0-f169.google.com Received: from [209.85.220.169] ([209.85.220.169:56172] helo=mail-vc0-f169.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 41/AC-62407-C60CDE45 for ; Wed, 25 Feb 2015 07:30:36 -0500 Received: by mail-vc0-f169.google.com with SMTP id kv19so1220658vcb.0 for ; Wed, 25 Feb 2015 04:30:33 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=PkKRW/G4lR+xn9bBI2GGqAzap7csRie2xU3YQrgD7y0=; b=eBxrp9zTlPe8ti2Yt1KasceJsUXRwA8nih+4nsOVd5Vm31QesB9XoAjT5twCAjpPJS rRadReygJm5CC7uhUqy9DvtB3y//yZEO/+L0N4iOU77n8aDspKEb7JPWrJCuJg0fY2nJ PiIWQqCOCXZUmIxejbwblha1Y+gUHQEGiPXkR9r4dIfbjCWb0rAl3fQj0ivn2MTpSkdN AdGHOjZ1HE0hJcjuHEc0w7v+QRjcjQPXNfcrr1SDUDX71OIENuUPyI/X23evGhJHheq0 18hw9jK1fnqnButASySKHpuNgsedVKPpehsdEeIiWZMsoy72E/pk5GWY8p2NVsoTCklj 42gQ== X-Gm-Message-State: ALoCoQlWa4/OX8dJsg021mdFFAeVkH2lvinP7xbY3hQZdi2+ObiiuQQthbAhrVhCm6O6tRi+Yru643kaWBHkB2/eYh+KOLw8lU7QyRlufWDeXyquGFJx+CAdxAxrPi4btDU/tk87bBQkiZP9+w07nHQ+rSVeUYnJgA== MIME-Version: 1.0 X-Received: by 10.52.52.136 with SMTP id t8mr3606355vdo.49.1424867433090; Wed, 25 Feb 2015 04:30:33 -0800 (PST) Received: by 10.52.113.231 with HTTP; Wed, 25 Feb 2015 04:30:32 -0800 (PST) In-Reply-To: References: Date: Wed, 25 Feb 2015 16:30:32 +0400 Message-ID: To: Anthony Ferrara Cc: "internals@lists.php.net" Content-Type: multipart/alternative; boundary=089e0115f04833a7e8050fe8cd36 Subject: Re: [PHP-DEV] Re: [RFC-Discuss] Scalar Type Declarations v0.5 From: dmitry@zend.com (Dmitry Stogov) --089e0115f04833a7e8050fe8cd36 Content-Type: text/plain; charset=UTF-8 anyone may tell, what this will print without running :) main.php ======== a.php ===== b.php ===== Thank. Dmitry. On Wed, Feb 25, 2015 at 3:19 PM, Dmitry Stogov 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 > 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 >> 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: >> >> >> >> > >> declare(strict_types=1) { >> >> //... >> >> } >> >> declare(strict_types=0) { >> >> //... >> >> } >> >> >> >> Having trailing code or code outside of the declare would be a compile >> error. >> >> >> >> > >> 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 >> >> > --089e0115f04833a7e8050fe8cd36--