On Tue, Sep 1, 2015 at 5:29 AM, Craig Francis <cr...@craigfrancis.co.uk> wrote:
> Hi Rowan, Ryan, James, Bishop, Stas, Lester,
>
> I've been giving this some thought over the weekend, and I agree with what 
> you are all saying, but I think there is an element of confusion in the PHP 
> programming community that needs to be addressed (somehow).
>
> Yes, we probably should not be giving special meaning to NULL, as James 
> mentions (although I probably still will).
>
> And to be fair, I still can't think of an example where isset() can be used 
> on a standard variable. All my examples are really array based, and better 
> addressed with array_key_exists() - where Rowan does a great job of 
> explaining the different examples on stackoverflow:
>
>   http://stackoverflow.com/a/18646568/2908724
>
> Trying to get to route of the confusion though, I think it might be down to 
> how the code can be read. So if we take:
>
> <?php
>   $a = 1;
>   $b = NULL;
>   var_dump($a);
>   var_dump($b);
>   var_dump($c);
>   var_dump(isset($a));
>   var_dump(isset($b));
>   var_dump(isset($c));
> ?>
>
> Or using an array instead:
>
> <?php
>   $v['a'] = 1;
>   $v['b'] = NULL;
>   var_dump($v['a']);
>   var_dump($v['b']);
>   var_dump($v['c']);
>   var_dump(isset($v['a']));
>   var_dump(isset($v['b']));
>   var_dump(isset($v['c']));
> ?>
>
> In both cases (and ignoring the undefined variable error), we get:
>
>   int(1)
>   NULL
>   NULL
>
>   bool(true)
>   bool(false)
>   bool(false)
>
> But if we ignore the manual for a minute:
>
>   http://php.net/isset
>
> I think a good comparison to what that code reads as, vs what PHP does, can 
> be summarised as:
>
>   Read as: The variable is set (exists).
>
>   Executed as: The variables *value* is set.
>
> Where NULL is not considered a set value.
>
> So when we have:
>
>   if (isset($v['a'])) {
>   }
>
> It's not saying that the key 'a' is set (exists) on the array $v.
>
> Instead its saying that the key 'a' has a set value (not NULL) on the array 
> $v.
>
> Where this is made more of a common problem because there are many array_* 
> functions, and they rarely come to mind when your not thinking of an array 
> like operation.
>
> This situation might be improved by re-wording the manual a bit.
>
> Having headings like "This also work[s] for elements in arrays", makes it 
> sound all inclusive and *the* function to use.
>
> Whereas I'm starting to get the feeling that isset() is actually a function 
> that probably should be avoided (I'll skip this tangent for now).
>
> Personally I still like the idea of an exists(), because I feel that is how 
> many programmers treat and use the isset() function - simply because they do 
> use NULL as a valid value, and either haven't read the manual, or forget the 
> exception that is mentioned on line 1 (something I've done a couple of times).
>
> Although I realise it will take many years before anyone can start using it.
>
> Craig
>
>
>
>
>
>
>
>
> On 26 Aug 2015, at 19:44, Rowan Collins <rowan.coll...@gmail.com> wrote:
>
>> Craig Francis wrote on 26/08/2015 18:07:
>>> I provide examples to help explain that I (and I suspect most developers) 
>>> default to using isset which works on either.
>>>
>>> Just because there is a function, which does not exactly roll off the 
>>> tongue (plus the fun of the needle/haystack ordering issue), does not mean 
>>> it gets used (even if it is the correct thing to use).
>>
>>
>> That's all very well, but what is the Internals community supposed to do 
>> about it? Does the documentation need to be improved to point out that there 
>> is a better function to use for this case?
>>
>>> I say "or key" because developers use the isset function on both $var and 
>>> $var['key']... yes, I know they are different, but when you are coding in 
>>> PHP an isset check is an isset check (well it isn't, because the variable 
>>> may technically exist).
>>>
>>> If this is a problem, maybe PHP should raise a notice when isset is used on 
>>> arrays?
>>
>>
>> It's only a problem in the same way that using file_exists() is a problem 
>> when you actually wanted the functionality of is_readable() - both functions 
>> exist, and it's not the language's responsibility to guess which you meant.
>>
>>
>>
>>>>> where NULL may be a perfectly valid value.
>>>> It's not that NULL isn't a valid value; it's that "doesn't exist" isn't a 
>>>> meaningful state for a variable. It's like checking if the current line 
>>>> number is greater than 100, it shouldn't mean anything to the compiled 
>>>> program. See the SO answer I linked earlier for more thought experiments 
>>>> along these lines.
>>>
>>> I think you have been spending too much time in C.
>>>
>>> Most of the PHP code bases I've worked on set variables to NULL at some 
>>> point (and they are not calling unset, because that isn't the intention).
>>
>>
>> Perhaps my double negative made it unclear, so I will restate: there is 
>> nothing wrong with setting a variable to NULL. There is also nothing wrong 
>> with calling unset() on a plain variable, e.g. to make it obvious to readers 
>> of the code that this variable should not be used below this point.
>>
>> There IS something wrong with any code which needs to distinguish which of 
>> those two things happened, at run-time, because such code would be 
>> incredibly fragile and hard to follow.
>>
>> You could, if you wanted, emulate a boolean variable by using $foo=null for 
>> true, and unset($foo) for false, but why not simply have a boolean variable?
>>
>> [Incidentally, I know barely any C, but program PHP for a living.]
>>
>> Regards,
>> --
>> Rowan Collins
>> [IMSoP]
>>
>> --
>> PHP Internals - PHP Runtime Development Mailing List
>> To unsubscribe, visit: http://www.php.net/unsub.php
>>
>
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>

The pieces are already in place, if this is a desired feature we just
have to bring them together.

* array_key_exists()
* get_defined_vars()

I do agree that it would be years before anyone got to use it (either
7.1.0 or 8.0.0). I don't see that as a bad thing, this was low-hanging
fruit.

Scott Arciszewski
Chief Development Officer
Paragon Initiative Enterprises <https://paragonie.com>

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to