On Sat, 1 Jan 2022 at 23:17, Craig Francis <cr...@craigfrancis.co.uk> wrote:
> Draft RFC: > https://wiki.php.net/rfc/allow_null > I know, I'm a glutton for punishment, but I've started writing a patch for this: https://github.com/craigfrancis/php-src/compare/master...allow-null It does not affect any Fatal Error exceptions for scripts using 'strict_types'. For now it simply defines `Z_PARAM_STR_ALLOW_NULL`; it's not used by any functions yet (that's the next step). It works a bit like `Z_PARAM_STR_OR_NULL` (but it will return an empty string instead of NULL). It should be a fairly easy drop in replacement for `Z_PARAM_STR`. e.g. To update `htmlspecialchars()`, and related functions, I'd simply update this line: https://github.com/php/php-src/blob/7b90ebeb3f954123915f6d62fb7b2cd3fdf3c6ec/ext/standard/html.c#L1324 Please note I'm not a C programmer, and I barely understand the code base, so constructive/friendly feedback is welcome. Thanks, Craig Extra notes... No-one has given a single reason why any one of the listed functions should not allow `NULL`; that said, I appreciate that developers using `strict_types` do prefer this (and they will not be affected by this). I've not seen any suggestion on how Rector, PHPCompatibility, or anything else could provide a way to fix this issue automatically. Only very strict static analysis (e.g. Psalm at levels 1 to 3, with no baseline) currently picks up this issue. I am simply trying to "relax certain type requirements on a case by case basis" (which will help upgrading to PHP 9); ref the original discussion: https://externals.io/message/112327 I know one person simply said this was a "terrible idea", but I'm still waiting to hear any details on why. In response to the "it's a bit late" position; we only have a deprecation at the moment (can be ignored), it will be too late when PHP 9 starts raising Fatal Error exceptions for anyone committing the heinous crime of passing NULL to these functions (for reference, WordPress aren't exactly rushing to fix this one). The change in behaviour is done in `zend_parse_arg_str_weak()`, so I don't think it will make much of a performance difference; but considering how much effort went in to testing `is_literal()`, and how people still managed to mis-read that, and how other RFCs don't mention performance *details* at all, I'm skipping that bit of pain. And yes, I have seen the -4 on externals.io... thank you for that </sarcasm>.