Re: Allows arrays to be type-hinted with interfaces mimicking Array behaviour
| From: | Larry Garfield | Date: | Tue, 19 Feb 2019 16:32:31 +0000 |
| Subject: | Re: Allows arrays to be type-hinted with interfaces mimicking Array behaviour | ||
| References: | 1 2 3 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-104475@lists.php.net to get a copy of this message | ||
On Tuesday, February 19, 2019 3:38:16 AM CST Rowan Collins wrote:
> On Tue, 19 Feb 2019 at 02:44, Larry Garfield <larry@garfieldtech.com> wrote:
> > Yes, a lot of existing code uses arrays as anonymous structs. Such code
> > is,
> > IMO, "doing it wrong". That includes PHP default behavior in many cases.
> > The
> > super-globals are one of the exceptions, as since by definition you don't
> > know
> > what the keys could be in advance you need some sort of generic accessor.
> >
> > superglobals anyway on the grounds that globals are evil (fact check:
> > true).
> > There is often an object wrapping around the session that has get() and
> > set()
> > object be kind-of-array-ish-for-some-part-of-array-ish-ness is a
> > long-standing
> > problem, no question. iterable was a good addition. I think there was
> > discussion of a countable type hint at one point, but I don't think it
> > made it
> > That leaves ArrayAccessible (aka, you can put [] after it and something
> > useful
> > happens), which is what you describe. I would not be against adding such
> > a
> > instead of an object is Just Plain Wrong(tm). Even a bare public property
> > class is superior in every possible way, before we even get into questions
> > of
> > useful accessor methods.
> >
> > be. (Eg, parsing JSON, GET or POST parameters, etc.)
> > 2) You're being sloppy and not thinking through your API.
> > struct into an object that has appropriate accessors that can then handle
> > error cases, missing values, etc. Not doing so results in things like,
> > say,
> > particular anonymous-struct was missing a certain key, which I didn't know
> > was
> > possible, but it broke the whole application. (Seriously, that was my
> > entire
> > struct, even if you're using __get() or ArrayAccerss to do it. (SimpleXML
> > is
> > an example of that approach, for better or worse.)
> > where you have to care, but those are edge-casey.
> >
> > ArrayAccessible is a code smell, and the solution is to properly structure
> > your data and type hint on a defined class instead. Including an
> > ArrayAccessible pseudo-type would be just a matter of completeness, not
> > something I would advise anyone actually use.
>
> Hi Larry,
>
> The above post seems to have been mangled somewhere and lost some of its
> text. It's mostly readable anyway (and I think I agree with what's there)
> but if you have a copy of the original anywhere, you might want to re-post
> it.
>
> Regards,
<expletive deleted> No, I don't. That's the second time KMail has eaten half
a message on me. I am now officially in the market for a new local mail
client, because that's JUST NOT OK, KMAIL!
The gist is that if you're dealing with unknown foreign data (JSON, GET/POST,
etc.) you should be wrapping the raw structure into an object that provides a
better interface, default value handling, error handling, etc. If you know
what the keys are in advance, make it an explicit class, period.
So while I would be OK with an ArrayAccessible type hint for completeness, I
would view using it as a code smell.
Insert debate about union types here, as it's bound to come up at this point.
Excuse me while I go find a new Linux mail client that isn't a buggy data-
losing <censored>.
--Larry Garfield
Attachment: [application/pgp-signature] This is a digitally signed message part. signature.asc
Attachment: [application/pgp-signature] This is a digitally signed message part. signature.asc