Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:83891 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 89923 invoked from network); 26 Feb 2015 12:07:23 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 26 Feb 2015 12:07:23 -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.177 as permitted sender) X-PHP-List-Original-Sender: dmitry@zend.com X-Host-Fingerprint: 209.85.220.177 mail-vc0-f177.google.com Received: from [209.85.220.177] ([209.85.220.177:56066] helo=mail-vc0-f177.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 99/74-65287-97C0FE45 for ; Thu, 26 Feb 2015 07:07:23 -0500 Received: by mail-vc0-f177.google.com with SMTP id hy10so3676206vcb.8 for ; Thu, 26 Feb 2015 04:07:19 -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=DWjNCbgnWD1JRRZu2eFzpbdt9HK1fNquWBLpCQUOprM=; b=XDuSQAxSsBXh4Yap7RZa1O+kORm5PmkN9eQYTzD1/VswkV7FYB+L4VOD8eIkh3PT8Z wLx0tnge/ZFpHGNfRlTmRaSf8SKOIWv0vrY8ZzU4if7OBKm07w6jKkhjZMpS8yIFuIP3 rqdscCMGS5AuGT8vaJ5Onj9jAzBN4d+mlPDRhaCg4t/MOGk8YqxuuQfz4L8P93XvCEdT V++igYOEzqKJ8uKZX0bdp6iwyPQox41fqorBQ+E55a1VPKbk6gWHcfNGMu6pPc3Fxil3 Obg3jFcHf6eEHn67Yh8U0xG+/5uSWiO7TOfGFqVHdjejSNaYTfvYPLBWaFDyxnpxL2bx 0z1g== X-Gm-Message-State: ALoCoQkZW1MgitRrCGwRN720nilIu3nh57Qw2If983twLLtfJHAq+2bTp3RwmKe11Wzeivakt6/ulL+QLIyjFf+jxX3NnPmI/ZD+xczMkt9g4SPwVpnlUB0/n+y7XmEa1I6+0a93irM1CqCGWaa+NGgu1RMSmFsu0A== MIME-Version: 1.0 X-Received: by 10.52.103.75 with SMTP id fu11mr8302882vdb.5.1424952439496; Thu, 26 Feb 2015 04:07:19 -0800 (PST) Received: by 10.52.113.231 with HTTP; Thu, 26 Feb 2015 04:07:19 -0800 (PST) In-Reply-To: References: Date: Thu, 26 Feb 2015 16:07:19 +0400 Message-ID: To: Benjamin Eberlei Cc: Anthony Ferrara , PHP Internals Content-Type: multipart/alternative; boundary=047d7b86d990fa77a6050ffc972e Subject: Re: [PHP-DEV] Strict typing and callback vs declare() From: dmitry@zend.com (Dmitry Stogov) --047d7b86d990fa77a6050ffc972e Content-Type: text/plain; charset=UTF-8 On Thu, Feb 26, 2015 at 2:34 PM, Benjamin Eberlei wrote: > > > On Thu, Feb 26, 2015 at 12:24 PM, Dmitry Stogov wrote: > >> >> >> On Thu, Feb 26, 2015 at 2:09 PM, Benjamin Eberlei >> wrote: >> >>> >>> >>> On Thu, Feb 26, 2015 at 11:56 AM, Dmitry Stogov wrote: >>> >>>> >>>> >>>> On Thu, Feb 26, 2015 at 1:34 PM, Benjamin Eberlei >>>> wrote: >>>> >>>>> >>>>> >>>>> On Thu, Feb 26, 2015 at 11:10 AM, Dmitry Stogov >>>>> wrote: >>>>> >>>>>> Hi Anthony, >>>>>> >>>>>> What do you think about using a user level callback for strict type >>>>>> checks >>>>>> instead of declare(). It won't allow changing behavior per file, but >>>>>> this >>>>>> has its own cons and pros. >>>>>> >>>>>> >>>>> set_strict_type_checker(function ($class_name, $function_nume, >>>>>> $arg_num, >>>>>> $expected_type, $value, $file, $line) { >>>>>> ... >>>>>> return false; >>>>>> }); >>>>>> include("orig_index.php"); >>>>>> ?> >>>>>> >>>>>> If callback is not set, arguments are converted according to standard >>>>>> rules, if set and returns false - fatal error or exception is thrown. >>>>>> >>>>>> The implementation should be simpler and more efficient than using >>>>>> declare(). >>>>>> >>>>>> Thanks. Dmitry. >>>>>> >>>>> >>>>> This ruins portability with third party libraries completely. >>>>> >>>> >>>> Not completely, because checker may be smart enough to return "true" >>>> for third party files. >>>> >>>> >>> set_strict_type_checker(function ($class_name, $function_nume, >>>> $arg_num,$expected_type, $value, $file, $line) { >>>> if (!my_own_file($filename)) { >>>> return true; >>>> } >>>> ... >>>> return false; >>>> }); >>>> include("index.php"); >>>> ?> >>>> >>>> And you won't have to modify each file in your project adding >>>> declare(strict_types=1). >>>> >>> >>> Yes, but you need a mechanism for each third party library to register >>> their typechecker code and then build a generic type checker system using >>> the right checks for the right library. This will produce really slow code >>> considering it will trigger this on every argument. >>> >> >> Only for strictly wrong arguments. >> >> >>> Also i find declare(strict_types=1) is already adding another stack in >>> my mind to think about, now having to think about every file/lirary having >>> a different kind of validation makes it even more complicated. >>> >> >> You 'll have to think about each file anyway. To add or not to add >> declare(strict_types=1). >> > > Yes, but It has only exactly one ruleset to keep in mind. With your > approach the ruleset space is infinite. Much more complex. > I agree. It's more complex, but also more flexibly. anyway, I just had an idea and posted it to discuss. > > >> Callback would allow to care about strict type checks in one separate >> place. >> It's like to keep a screw key with every nut in your car instead of >> keeping toolbox. >> > >> >>> >>> Additionally it destroys the AOT compile benefit of static type hints, >>> since you cannot compile code down to C again, because the >>> conversion/validation is not necesarily deterministic. >>> >> >> Oh god... >> If you know the type of passed and expected argument at compile time, >> strictness doesn't make any difference (you may only report a error at >> compile time). >> If you don't know type of passed or expected argument at compile time, >> you'll have to check their equality at run-time anyway. >> > > This is not my argument, just saying that what strict Types would allow > (static analysis and AOT) is not possible when the static rules are not > determinstic. This will lead to every pro static person to reject your > approach. declare(strict_types=1) is about having a single, pre-determined, > deterministic ruleset. > I heard it many time and many times replied with the same sentences as above. In my opinion, this argument is not true. It's possible to do equally efficient static analyses and AOT with weak and strict types. For example: At call site we know that $b is integer and foo() expects integer. so we don't need to generate code for any checks At call site we know what foo() expects integer, but don't know type of $b. Sp we have to check it at run-time. Here we know both types and now that they are not the same. With strict type hints we may generate a compile-time error message or a code for run-time error message. With weak type hints we will generate an unconditional call to run-type conversion function e.g. convert_string_to_long(); If we know the value at compile-time we may also perform compile-time conversion. Thanks. Dmitry. > > >> >> Thanks. Dmitry. >> >> >>> >>> >>>> >>>> Thanks. Dmitry. >>>> >>>> >>>> >>> >> > --047d7b86d990fa77a6050ffc972e--