Re: NULL Coercion Consistency

From: Date: Sat, 28 May 2022 02:35:59 +0000
Subject: Re: NULL Coercion Consistency
References: 1 2 3 4 5  Groups: php.internals 
Request: Send a blank email to internals+get-117810@lists.php.net to get a copy of this message
On 27 May 2022, at 10:11, Rowan Tommins <rowan.collins@gmail.com> wrote: > On 26/05/2022 13:20, Craig Francis wrote: >> First, the Docblock originally said this function did not accept NULL, but at runtime it >> accepted/coerced NULL to an empty string. This is exactly how >> htmlspecialchars() worked pre 8.1. Where developers using static >> analysis tools can choose to treat NULL as an invalid value, and those tools could report nullable >> variables as an error (via strict type checking). > > > The same events can be given a very different narrative: > > Originally, this function was not intended to accept null. The documentation clearly stated the > accepted types, and any static analysis tool would reject any value not in that list. The author of > the function chose to treat NULL as an invalid value. > > Because the list of valid types wasn't enforced at run-time, it was accidentally possible > to pass null. Many developers who weren't using additional tooling came to rely on this bug, so > as a compromise, the authors decided to change the documented behaviour of nulls. > > At no point did anybody look at the function and say "I can safely pass null to this, as > long as I remember never to use static analysis tools". They accidentally passed null, and by > luck got a useful result. I'm really sorry, but I'm not sure what your point is... I was asking why passing NULL to htmlspecialchars() represents a problem, but we should just leave it, we're not getting anywhere. >>> I also note that the commit message says "On PHP >= 8.1, an error is thrown if >>> null is passed to >>> htmlspecialchars." which is of course not true for native PHP, >>> only if you make the highly dubious decision to promote deprecations to errors. >> While I'd put the word "error" down as a typo, the intention is for 9.0 to >> throw a type error. > > > My point is that there is no action required on PHP 8.1. The commit message should have said, > "On PHP >= 9.0, an error will be thrown if null is passed to > htmlspecialchars." But deprecation messages do prompt developers to make changes (action is required). For those who do "no action", when they try upgrading to 9.0, they will have a bit of a problem (with no easy fix). >> And while user-defined functions are part of the conversation (for consistency reasons), >> I'm trying to find the benefits of breaking NULL coercion for internal functions (because, if >> there is an overall benefit, that Laravel Blade patch should be reverted). > > > This is a complete non sequitur. It's perfectly possible for different scenarios to > support different decisions, and what Laravel decides that particular function should accept is > based on their own assessment of the trade-offs. PHP is free to make an entirely different decision > based on entirely different trade-offs. Sorry, but I'm not following... if there is a benefit/reason for PHP to reject NULL for htmlspecialchars(), and I'm just too stupid to see what it is, I would have assumed that benefit/reason would also apply to the HTML encoding function e() in Laravel. > Meanwhile, the benefits have been explained repeatedly in this thread. You may not agree that > they are worth the cost, and as I've repeatedly said, I have some sympathy for that. But please > stop trying to take the conversation back to the very beginning by implying that you've asked a > question and not received an answer. Sorry, I'm just not getting it, I have read and re-read all of your emails many times, and I'm clearly not clever enough to understand. Anyway, I've send a separate email about my RFC, because I cannot find a solution... I've tried my best, and I'm done. Craig

« previous php.internals (#117810) next »