Proposed RFC

php.internals

Antony D'Andrea

9 years ago
Hi all, First off, this is my first time e-mailing internals or even thinking about submitting RFC. Please forgive me if I fail to follow some kind of convention. In PHP 7.0, we were given the Null Coalesce operator. For example: echo $array['key']??"key is not set" would be the same as: echo (isset($array['key'])?$array['key']:"key is not set" This is a great feature, that makes code much cleaner. This works on the principle that "$array['key']" is "NULL". I would like to propose a new feature that is as clean as this but is a slightly different use case. This would require a new operator (up for discussion, but an early idea is "?!") For example: echo (!is_infinite($n1/$n2)?!0); Would output ($n1/$n2) if it is "true" and 0 if false. Right now, the closest we have to this is ?: operator. The problem with this is that it could get very messy as you still have to do: echo (!is_infinite($n1/$n2)?$n1/$n2:0); I have obviously over simplified the example. You wouldn't have a big problem in this case, but if the subject of the function is much longer, it can become complicated very quickly. Alternatively, a perhaps more general feature would be to just have the same functionality as the Null Coalesce, but with true/false rather than Null/Not Null. Please let me know if there is something in these ideas or anyway to improve them. I should also note that I would need a volunteer to implement this as my "C" skills are non-existent and I wouldn't have the confidence to delve into the the PHP source. Thanks for your time. Best, Antony D'Andrea

David Rodrigues

9 years ago
You have tried the ?: operator? echo !is_infinite($n1/$n2) ?: 0; It should returns true or 0, for this case. 2016-11-03 13:02 GMT-02:00 Antony D'Andrea <contactme@antonydandrea.com>:
> Hi all, > > First off, this is my first time e-mailing internals or even thinking about submitting RFC. Please forgive me if I fail to follow some kind of convention. > > In PHP 7.0, we were given the Null Coalesce operator. For example: > > echo $array['key']??"key is not set" > > would be the same as: > > echo (isset($array['key'])?$array['key']:"key is not set" > > This is a great feature, that makes code much cleaner. > > This works on the principle that "$array['key']" is "NULL". > > I would like to propose a new feature that is as clean as this but is a slightly different use case. This would require a new operator (up for discussion, but an early idea is "?!") For example: > > echo (!is_infinite($n1/$n2)?!0); > > Would output ($n1/$n2) if it is "true" and 0 if false. > > Right now, the closest we have to this is ?: operator. The problem with this is that it could get very messy as you still have to do: > > echo (!is_infinite($n1/$n2)?$n1/$n2:0); > > I have obviously over simplified the example. You wouldn't have a big problem in this case, but if the subject of the function is much longer, it can become complicated very quickly. > > Alternatively, a perhaps more general feature would be to just have the same functionality as the Null Coalesce, but with true/false rather than Null/Not Null. > > Please let me know if there is something in these ideas or anyway to improve them. I should also note that I would need a volunteer to implement this as my "C" skills are non-existent and I wouldn't have the confidence to delve into the the PHP source. > > Thanks for your time. > > Best, > > Antony D'Andrea
-- David Rodrigues

Bishop Bettini

9 years ago
On Thu, Nov 3, 2016 at 11:02 AM, Antony D'Andrea < contactme@antonydandrea.com> wrote:
> > I would like to propose a new feature that is as clean as this but is a > slightly different use case. This would require a new operator (up for > discussion, but an early idea is "?!") For example: > > echo (!is_infinite($n1/$n2)?!0); > > Would output ($n1/$n2) if it is "true" and 0 if false. >
Welcome! Let me read back what I'm hearing. If the predicate returns truthy, you want to return the argument to the predicate, otherwise the indicated default? How would this be used outside predicates, such as on string functions? Consider: echo strpos('abc', 'b') ?! 0; What would this output, and what would the purpose of such a construct be?

Antony D'Andrea

9 years ago
Thanks everyone for your responses. It has not taken long to find situations where this idea starts to fall apart. For example, in the case of strpos, I would hope for the return value, but in other cases I would want the the original input if the output is not false. That makes this feature pretty unfeasible I think! ________________________________ From: bishop.bettini@gmail.com [bishop.bettini@gmail.com] on behalf of Bishop Bettini [bishop@php.net] Sent: 03 November 2016 16:02 To: Antony D'Andrea Cc: internals@lists.php.net Subject: Re: [PHP-DEV] Proposed RFC On Thu, Nov 3, 2016 at 11:02 AM, Antony D'Andrea <contactme@antonydandrea.com<mailto:contactme@antonydandrea.com>> wrote: I would like to propose a new feature that is as clean as this but is a slightly different use case. This would require a new operator (up for discussion, but an early idea is "?!") For example: echo (!is_infinite($n1/$n2)?!0); Would output ($n1/$n2) if it is "true" and 0 if false. Welcome! Let me read back what I'm hearing. If the predicate returns truthy, you want to return the argument to the predicate, otherwise the indicated default? How would this be used outside predicates, such as on string functions? Consider: echo strpos('abc', 'b') ?! 0; What would this output, and what would the purpose of such a construct be?

Stas Malyshev

9 years ago
Hi!
> It has not taken long to find situations where this idea starts to > fall apart. For example, in the case of strpos, I would hope for the > return value, but in other cases I would want the the original input > if the output is not false.
A side note - when discussing an idea, it would be great to use a descriptive subject next time. E.g.: "RFC idea - new ?! operator". It is not uncommon that several RFC are discussed at the same time, much easier when each one has a descriptive subject. Also, emails are archived and somebody interested in the same idea in the future may try to find this discussion a year or two from now, and the descriptive subject would help a lot. Thanks,
-- Stas Malyshev smalyshev@gmail.com