as proposed by Nikita and Joe, I'm submitting this late RFC for your > consideration for inclusion in PHP 8.1. Intersection types as currently > accepted are not nullable. This RFC proposes to make them so. > > I wrote everything down about the reasons why here: > https://wiki.php.net/rfc/nullable_intersection_types > > Please have a look and let me know what you think. >
Hi everyone, Thank you for the contributions made to the discussion so far. I'm mostly AFK these days, hiking in Greece. That gives me time to think about comments made here, among other things :) Given the strong opposition from some, I considered withdrawing the RFC. But since I also see some nice support, I decided not to: even if the proposal is rejected, everyone should have the right to express their opinion, and the vote is the only option to not let only the most vocal or the most eloquent decide for the others. For the same reason, I'm not going to restrict the voting options to (X&Y)|null as some requested. I will change my mind if we spot that some syntax would put us in a corner. But so far and while I tried to be as careful as possible, all syntax proposals are future-proof to me. I get that some have strong coding style preferences, but that doesn't make a technical argument. It's true that deciding to allow no brackets won't allow us to force them later on. By why would we *force* them in the first place? While you may not like relying on it, operator precedence is a nice thing. I would hate having to put brackets around every single expression in PHP. For types, there are only two to three operators: we don't have to remember the full precedence table. And only one precedence makes sense anyway, so it's easy to remember. I'm not advocating that we should forbid brackets. Actually I'm going to vote for allowing both with and without them, because I don't want to force my preferred coding style to others. I do have a preference for using the `?` operator. It is compact and nullability *is* a flag. I'm reviewing code that use foo|null|bar, other that use foo|bar|null. That makes reading the code harder. About its precedence, I explained why I didn't need to be creative in the RFC: `?` has to be the lowest precedence type-operator. Any other options would make no sense from a logical pov. It would be so sweet and consistent to be able to use it all the time to express the nullability flag. I would mind if we allowed both `?` and `|null` btw. Intersection types are a really useful addition to the language, please don't suggest I framed it otherwise. I just thought that they would be a lot less useful if they were not nullable, especially considering that they could be part of public signatures that have to be maintained with BC in mind. I'm happy that some agree with this and share their experience about it. Nullability is a special beast in PHP. We have a range of operators dedicated to it. That's also why I think it deserves special care, and why I think it's important to have this discussion before 8.1 is out. To me, the feature freeze is also useful for this: polishing features that are about to be released. I don't see us rushing here. Let's do a careful and rational analysis of the proposal and vote on the very asked question. We do have enough time. TL;DR: I'm carefully looking for blockers and I'm calling for more examples if you spotted one! Cheers, Nicolas >