On Tue, May 7, 2019 at 5:14 PM Mark Randall <mar...@gmail.com> wrote:
> On 07/05/2019 15:22, Gert wrote: > > My idea, extremely summarized, would be to take the functions that > > return false/null when they 'error', and instead make them actually > > throw an error. > > It comes up on various discussion forums every other month. There's a > few downsides to it, but mainly that any existing error handling would > need to be re-written as tests for the false value would never be > reached after the exception was thrown. > > It's a bit less of a hassle for more modern PHP design practices, as any > warnings are globally promoted to exceptions using set_error_handler in > userspace, but this too has its problems (for example in third party > libraries). > > IIRC, most functions are at least checking their input argument types > now and throwing InvalidArgumentExceptions, and the odd few like > json_decode have their exception behaviour, provided its flagged. The > new security focused stuff always throws (such as if there's not enough > entropy available). > > I don't think it's in any way practical to add throw-or-not flags to > every other internal function that could error out, and so there are 4 > options that I can see: > > 1. Make no change. > > 2. Everything throws. People have to re-write. The compiler would > probably need to further inspect the AST at compile time, and throw a > depreciation warning if the result of an error-able internal function > was tested for false. > > 3. Class (or namespace) level declares to throw on internal function > errors. > > 4. Leave the existing functions as-is, finally claim the \php namespace, > alias all of the internal functions into it, and make their default, > unchangeable behaviour be to throw a RuntimeException on error. > > -- > Mark Randall > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php > > For the record, there is already a library for option 3: https://github.com/thecodingmachine/safe Another option would be to introduce a new declare directive, something like <?php declare(throw_on_error=true); $json = file_get_contents('foobar.json'); // will throw -- Thank you and best regards, Eugene Leonovich