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

I can concur with disliking the error suppression operator, and in general
silent failures. This is why we
have linting CI checkers though ;-) Tbh, I also dislike silent type
"juggling" for the same reason. But
those are my opinions, and they don't get on with everyone.

Deprecation of the operator is probably a different discussion. Though to
say a few words on it: if
presented with no other option, I'd rather someone suppress an error in a
controlled single-use
manner, than changing the global error reporting setting somewhere in their
code to do the same
thing.
Notwithstanding my preference on error suppression method, I'd still prefer
it avoided if at all possible,
though again, very much IMO.

Regardless of personal opinion on actually using the operator, would you
not rather it were used in all
cases of error suppression?
'tis to say, if we are going to introduce new error suppression behaviour
(which is what the proposal
here does), should it not be consistent with existing language features?

Given that the error suppression operator is a feature already in the
language, I think that it makes
sense to use it to facilitate this use case of "silently skip the loop if
it errors", as opposed to introducing
a new operator to do it.

I think it makes sense to force its use to be as targeted as possible too:
Placing the `@` on `as` is the most targeted placement for catching the
failure we're talking about (failing to
be able to iterate over something), as opposed to something like `@foreach`
which could feasibly mean
anything failing in the entire loop block.

If we're going to introduce this behaviour, let's get it right ;-) (even if
we don't like it ourselves)

Kind regards,
Aidan

On 12 July 2017 at 16:26, Michał Brzuchalski <michal.brzuchal...@gmail.com>
wrote:

> 12.07.2017 15:35 "Mark Shust" <m...@shust.com> napisał(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
> definition
> > 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 <aidantwo...@gmail.com>
> 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 <m...@shust.com> 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 <aidantwo...@gmail.com>
> > >> 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
> there
> > >>> 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
> like
> > >>> `@foreach ($foo as $bar)` or `foreach @($foo as $bar)`.
> > >>>
> > >>>
> > >>> Regards,
> > >>> Aidan
> > >>>
> > >>> On 11 July 2017 at 20:06, Mark Shust <m...@shust.com> 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
> an
> > >>>> 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.coll...@gmail.com>
> > >>>> wrote:
> > >>>>
> > >>>> > On 11 July 2017 16:02:18 BST, Mark Shust <m...@shust.com> wrote:
> > >>>> > >For a syntactic
> > >>>> > >sugar/improvement, this can be shorthand for executing the loop
> > >>>> instead
> > >>>> > >of
> > >>>> > >wrapping the block within an is_array check:
> > >>>> > >
> > >>>> > >
> > >>>> > ><?php
> > >>>> > >
> > >>>> > >$foo = "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,
> this
> > >>>> 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
> to
> > >>>> 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
> inspire
> > >>>> > someone else.
> > >>>> >
> > >>>> > Regards,
> > >>>> >
> > >>>> > --
> > >>>> > Rowan Collins
> > >>>> > [IMSoP]
> > >>>> >
> > >>>>
> > >>>
> > >>>
> > >
>
>

Reply via email to