Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:99857 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 71466 invoked from network); 12 Jul 2017 15:26:06 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 12 Jul 2017 15:26:06 -0000 Authentication-Results: pb1.pair.com smtp.mail=michal.brzuchalski@gmail.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=michal.brzuchalski@gmail.com; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.128.180 as permitted sender) X-PHP-List-Original-Sender: michal.brzuchalski@gmail.com X-Host-Fingerprint: 209.85.128.180 mail-wr0-f180.google.com Received: from [209.85.128.180] ([209.85.128.180:32853] helo=mail-wr0-f180.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 66/07-01782-D8F36695 for ; Wed, 12 Jul 2017 11:26:06 -0400 Received: by mail-wr0-f180.google.com with SMTP id r103so38103749wrb.0 for ; Wed, 12 Jul 2017 08:26:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=zy6+T2TRhAg8G5zkegKbQuXdcHHXcdPG7W2NAOs/MpQ=; b=Y3ygydBm0ESJLw03ATGT2AC6NHNZmlnc8z4AC0c3tTvF7BaAEYRMyNMriJdyjttGHP 9PhDR95ZkcG+c/IuSheKtlGGlLNb0xnJC7Px96yDARuPJ1GX2tfmWdDCaOK4pzfz7nxs NFmaGRyRmQ+NRYHVsXY+W/CScvhWxSE1AjpV/XJB9pd97gQmfQH08jRWCRs8SgWdOh4p dqydqq1272fMPS7067XphgtuHpjr2Sg/c8sjfiA7iLbxlnx0DQEisuuyRsu70l8bPAmH EckPCno55aKn6lgcRpy1QUPJMrUUX1o6pBNGZzGyKvTidE/utd0t9nlC6xci8DlB4JhU wpRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=zy6+T2TRhAg8G5zkegKbQuXdcHHXcdPG7W2NAOs/MpQ=; b=SW0mOH9klASWxeHAmOcuN++wyQbSxjTS+B7iQnlDAZSyjYUNbUtx33BHSQqgLwDkya c0VvdcMOxD6EcRHQPHv66AmHlCIBKmXbyy01p8rj9EIDH0ZJKWBztBgJMD4BK7LnghIf wManpXktcm6DVT893pQYSRcO7SyZXH05pgWZaiOyhWwFfdjF4CJvcB72VDbQC3rsxA1O U0wjqHr8AvhfGHnMOfl/h1LozxM6hjaGjlunHcGM4IZZJPMKSGVDUK7p3UY4wgVvYsiB 0Gd430r3Bv9zvyrEI06xfpRlfDUWaVwhlNyqGK7O9tZSSh1Fgj6EnaIg34je/+vHbckr VfOQ== X-Gm-Message-State: AIVw111dAjHCIf5stK6JpQ90GTda1SiQ1oFZvfyvfbGCQhKc8l0ejC87 vjIdp2LK83KjSFjCoDpNhzsCqfgwwQ== X-Received: by 10.223.174.147 with SMTP id y19mr3125842wrc.155.1499873162434; Wed, 12 Jul 2017 08:26:02 -0700 (PDT) MIME-Version: 1.0 Received: by 10.223.134.13 with HTTP; Wed, 12 Jul 2017 08:26:01 -0700 (PDT) Received: by 10.223.134.13 with HTTP; Wed, 12 Jul 2017 08:26:01 -0700 (PDT) In-Reply-To: References: Date: Wed, 12 Jul 2017 17:26:01 +0200 Message-ID: To: Mark Shust Cc: Rowan Collins , PHP Internals List , Aidan Woods Content-Type: multipart/alternative; boundary="001a1140a5160e1f790554206f6d" Subject: Re: [PHP-DEV] array coalesce operator concept From: michal.brzuchalski@gmail.com (=?UTF-8?Q?Micha=C5=82_Brzuchalski?=) --001a1140a5160e1f790554206f6d Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable 12.07.2017 15:35 "Mark Shust" napisa=C5=82(a): > > Hi Aidan, > > I think you are correct on all points. The initial emit is just a warning= , > so I think a suppressor will work just fine, since it does just pass over > the foreach if a traversable isn't passed in. > > I could see this being helpful as it makes wrapping an if block around a > foreach not needed anymore (and in turn indenting the foreach another > level), replacing it with just a single character. I also think for those > that use linting tools and flag error suppressions, that an @as definitio= n > could be easily ignored from such a linter. I develop with warnings on, and > see error suppressions as a sort of code smell, however I think the @as > definition could be really useful. IMHO the whole error supression and its operator should be deprecated and removed from language. Supressing errors is just hiding problems because someone didn't want to solve it. Supressing errors makes debuging very hard and leads to frustration. > > Cheers, > Mark > > On Wed, Jul 12, 2017 at 4:22 AM Aidan Woods wrote= : > > > In theory you'd only *need* it be considered a suppressor? PHP already > > exhibits the skipping behaviour (it only emits a warning for the wrong type > > used in `foreach`, skips the loop, and then continues with remaining code). > > > > No harm in/there is probably value in, making that skipping intent > > explicit in a RFC though, but in terms of a patch, the warning would only > > need be suppressed as far as I can tell? > > > > Another thing I meant to mention -- this should not only be useful for > > arrays, but for any `Traversable` too (i.e. it should suppress errors > > generated in using a type not compatible with being iterated over in a > > `foreach` loop, and not just if the type is not array). > > > > Kind regards, > > Aidan > > > > On 12 July 2017 at 02:50, Mark Shust wrote: > > > >> Aidan, > >> > >> Fantastic suggestion (@as) -- that is really the succinctness I was > >> initially looking for, and I think the intention makes a lot of sense. My > >> only concern/issue would be to make sure that isn't considered a > >> 'suppressor' -- but it's actual intent is to skip the execution of the > >> foreach to prevent the error/loop from occurring (rather than just > >> suppressing an error). > >> > >> Cheers, > >> Mark > >> > >> > >> On Tue, Jul 11, 2017 at 4:05 PM Aidan Woods > >> wrote: > >> > >>> If you were willing to accept > >>> > >>> ``` > >>> foreach ($foo as $bar) if (is_array) { > >>> ... > >>> } > >>> ``` > >>> > >>> as a solution, then you might as well use > >>> > >>> ``` > >>> if (is_array($foo)) foreach ($foo as $bar) { > >>> ... > >>> } > >>> ``` > >>> > >>> I wonder if this could be better achieved by expanding what the error > >>> suppression operator `@` can do? This entire behaviour seems more like an > >>> error suppression action on `foreach` to me, otherwise should we consider > >>> coalescing operators for other types/creating a more generic one? > >>> > >>> Going back to the error suppression operator: > >>> > >>> e.g. perhaps > >>> > >>> ``` > >>> foreach ($foo @as $bar) { > >>> ... > >>> } > >>> ``` > >>> > >>> could prevent skip past execution of the entire foreach block if ther= e > >>> is an error using $foo as an array. So might make most sense to place the > >>> `@` on `as`, IMO, but I guess arguments could be made to place it lik= e > >>> `@foreach ($foo as $bar)` or `foreach @($foo as $bar)`. > >>> > >>> > >>> Regards, > >>> Aidan > >>> > >>> On 11 July 2017 at 20:06, Mark Shust wrote: > >>> > >>>> Thanks for the great feedback. > >>>> > >>>> Based on the last mindset on keyword syntax, this comes to mind, > >>>> intended > >>>> to be used similarly to the 'use' keyword when used within the context > >>>> of a > >>>> closure: > >>>> > >>>> foreach ($foo as $bar) if (is_array) { > >>>> ... > >>>> } > >>>> > >>>> > >>>> I don't think this is a vast improvement over wrapping this within a= n > >>>> is_array check, however it does avoid the additional nest/wrapping. = I > >>>> was > >>>> hoping for something that reads a bit more concisely or with a bit more > >>>> syntactical sugar than the above. I think this does read nicely though. > >>>> > >>>> Cheers, > >>>> Mark > >>>> > >>>> On Tue, Jul 11, 2017 at 1:50 PM Rowan Collins < rowan.collins@gmail.com> > >>>> wrote: > >>>> > >>>> > On 11 July 2017 16:02:18 BST, Mark Shust wrote: > >>>> > >For a syntactic > >>>> > >sugar/improvement, this can be shorthand for executing the loop > >>>> instead > >>>> > >of > >>>> > >wrapping the block within an is_array check: > >>>> > > > >>>> > > > >>>> > > >>>> > > > >>>> > >$foo =3D "abc"; > >>>> > > > >>>> > >foreach (??$foo as $bar) { > >>>> > > > >>>> > > echo $bar; > >>>> > > > >>>> > >} > >>>> > > >>>> > Hi! > >>>> > > >>>> > I think there's definitely the start of a good idea here, but the > >>>> syntax > >>>> > you suggest doesn't read quite right. As has been pointed out, thi= s > >>>> differs > >>>> > from existing features in two ways: > >>>> > > >>>> > - the special handling is for any non-iterable value, not just null or > >>>> > empty/falsey values, for which you could use $foo??[] and $foo?:[] > >>>> > respectively > >>>> > - the handling is to skip the loop, not loop once assigning $bar t= o > >>>> the > >>>> > scalar value, as would happen with (array)$foo > >>>> > > >>>> > The challenge, then, is to come up with some syntax that somehow > >>>> suggests > >>>> > these rules. The "??" is too much like the null coalesce, which would > >>>> be > >>>> > misleading. > >>>> > > >>>> > The only idea that immediately comes to mind is a keyword: > >>>> > > >>>> > foreach ifarray ($foo as $bar) { > >>>> > > >>>> > I can't say I'm that keen on that syntax, but maybe it will inspir= e > >>>> > someone else. > >>>> > > >>>> > Regards, > >>>> > > >>>> > -- > >>>> > Rowan Collins > >>>> > [IMSoP] > >>>> > > >>>> > >>> > >>> > > --001a1140a5160e1f790554206f6d--