On Monday, June 18, 2018 4:25:27 AM CDT Christoph M. Becker wrote:
> On 18.06.2018 at 00:09, Enno Woortmann wrote:
> > In my opinion that's the argument to return null for either parameters
> > which aren't an array or empty arrays simply because a first/last key
> > isn't present and null is the value to be returned for an undefined state.
> > I've tested this behavior with other array_* functions which are
> > provided in the PHP core and they provide null consistently, eg.:
> >
> > root@WOL-Soft-DEVVM:/var/www/WOL-Soft# php -r "var_dump(array_keys(1));"
> > PHP Warning: array_keys() expects parameter 1 to be array, integer
> > given in Command line code on line 1
> > NULL
> > root@WOL-Soft-DEVVM:/var/www/WOL-Soft# php -r
> > "var_dump(array_values('hello'));"
> > PHP Warning: array_values() expects parameter 1 to be array, string
> > given in Command line code on line 1
> > NULL
> > root@WOL-Soft-DEVVM:/var/www/WOL-Soft# php -r
> > "var_dump(array_flip(null));"
> > PHP Warning: array_flip() expects parameter 1 to be array, null given
> > in Command line code on line 1
> > NULL
>
> These return values are due to zend_parse_parameters() failures (i.e.
> the given types don't match the expected types), and it's customary to
> return NULL in this case (under strict typing an exception would be
> thrown instead). However, most functions signal other failures by
> returning FALSE, for instance:
>
> var_dump(array_search('foo', [])); // => bool(false)
>
> I would prefer, if these other functions would return NULL, though, but
> we can't change that for BC reasons.
Returning false for "not found" rather than "null" is a big middle-finger to
users. :-) Besides the reasons here, the violation of type constraints
totally screws up the surrounding code. Especially with null-coalesce. For
instance, this thing of beauty:
$secret = getenv('APP_SECRET')
?? $_SERVER['APP_SECRET']
?? getenv('DEFAULT_SECRET')
;
doesn't actually work, because getenv() returns false instead of null.
Instead you have to do this mess:
$secret = (getenv('APP_SECRET') ?: null)
?? $_SERVER['APP_SECRET']
?? (getenv('DEFAULT_SECRET') ?: null)
;
See also:
https://www.garfieldtech.com/blog/empty-return-values
Can we please never return false for error/not-found, ever, period, forever
more? It's a fundamentally broken idiom that needs to die.
--Larry Garfield
signature.asc
Description: This is a digitally signed message part.
