Re: PHP 7.1 - Address PHPSadness #28?
| From: | Robert Williams | Date: | Wed, 16 Sep 2015 19:56:22 +0000 |
| Subject: | Re: PHP 7.1 - Address PHPSadness #28? | ||
| References: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-88258@lists.php.net to get a copy of this message | ||
On Sep 16, 2015, at 11:14, Rowan Collins <rowan.collins@gmail.com> wrote:
>
> Robert Williams wrote on 16/09/2015 18:37:
>> The docs suggest that uninitialized variables are null, and the above makes it sound like
>> that’s what you’re stating, too. But they’re not: they don’t exist at all, they’re
>> uninitialized.
>
> As soon as you access them, you will get the value null. You can do everything with them that
> you could do with a variable initialised to null.
As soon as you access them, you get an error, and then you get null. Yeah, one could register an
error handler, but that’s a lot of fuss just to see if a variable really exists or just exists
because you accessed it, and it pulls you out of context. Basically, there’s no (clean, very
simple) way to identify that you’re about to step in a pile of poo before you step in it.
>> If they were null, then PHP wouldn’t spit out errors about undefined variable accesses
>
> Once again - PHP does not spit out errors when you access an undefined variable. It spits out
> Notices in case you've done it by mistake. Maybe you're thinking of JavaScript?
In our shop, notices are most definitely errors. And notices aren’t graceful error handling. I
think PHP also also regards them as errors (thus the ability to catch them with an error handler) -
it’s just a lower grade of error.
> I don’t think it’s a huge gap in the language, but it’s a definite gap, and it’s one
> that many less-experienced programmers fall right into with safety checks.
>
> There is no safety check required. If you care about eliminating the Notices, then initialise
> all your variables properly, and you will never have an uninitialised variable (so a runtime check
> for one would be pointless). If you don't care about eliminating the Notices, then simply treat
> uninitialised variables as Null, and they will work absolutely fine.
That’s great in theory, but in practice, programmers’ code must frequently collaborate with
other people’s code, often code from outside their organization. In these cases, they don’t have
the control to just fix the problem on the other side. And in some cases, like with config files
that set bare variables, there’s really nothing wrong with the way it’s done that needs to be
fixed. Some folks might prefer to use a different model, but that’s just a preference.
Adding an exists() function doesn’t go against the foundation of PHP. It just fills a gap. Again,
I can define variables, and I can destroy them, but I can’t tell if they’ve already been
defined. In a dynamic language like PHP, I really don’t understand how folks can *not* see that as
an oversight. Further, we can do this for everything else… constants, array elements, object
properties, functions, and even classes, so why not variables? There's even have precedence for
controlling behavior based on variable existence in extract(), so PHP itself does it in ways that
directly affect the user, but the user can’t do it. Yes, there are workarounds for the gap. There
are almost always workarounds in a sufficiently developed language, but that doesn’t mean there
isn’t a gap.
-Bob
Attachment: [application/pgp-signature] Message signed with OpenPGP using GPGMail signature.asc
Attachment: [application/pgp-signature] Message signed with OpenPGP using GPGMail signature.asc