Re: [RFC] Safe Casting Functions
| From: | Andrea Faulds | Date: | Mon, 20 Oct 2014 23:39:25 +0000 |
| Subject: | Re: [RFC] Safe Casting Functions | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-78164@lists.php.net to get a copy of this message | ||
> On 21 Oct 2014, at 00:27, Lars Strojny <lars@strojny.net> wrote:
>
> I like the proposal except for one thing: the functions returning false in case of an error. As
> the next logical function would be "to_bool()", I foresee a lot of trouble with regards to
> API design as returning false there either means successful cast to false or an error while casting.
> What about changing the functions to take an $isError variable as a second argument?
>
> $value = to_string(1.2, $isError);
> if ($isError) {
> ...
> }
>
> Alternatively one could do the same thing with an $isSuccess variable:
>
> $value = to_string(1.2, $isSuccess);
> if (!$isSuccess) {
> ...
> }
>
> Thoughts?
This is an interesting question. It’s actually one I’d considered myself, I think I briefly
mention it in the RFC. However, I don’t expect it to be a problem, and the reason is really quite
simple: There’s no clear-cut one-size-fits all boolean casting function you could make, and
booleans are trivial to validate yourself.
Adding something like is_bool() would be possible, the problem is what behaviour it would have, and
there are too many possibilities. Do you accept 1 and 0? If so, do you accept all non-zero values,
or not? Is “true” TRUE or is it FALSE? Is “yes” TRUE or is it FALSE? Do “true” and
“yes” validate? Do they not? Does the empty string validate? Does it not? Bear in mind that
boolean casting was one of the most problematic areas of the abandoned Scalar Type Hinting RFC:
there’s no clear set of definitely boolean values, nor a clear idea of which mean which boolean
value. Basically, I don’t think we’d ever be able to draw the line.
The other thing is, well, there’s not really a need. You can quite simply do something like this:
if ($value !== “true” && $value === “false”) { /* error! */ } - and while this is
less convenient than is_bool, as I mentioned before, there’s no real agreement on what is_bool
should do so you’d have to do this anyway. A thought: A weird, but workable solution for one
particular style is [“true” => TRUE, “false” => FALSE][$value] ?? NULL - whether
that’s a wonderful or horrible use of PHP is up to you. ;)
So I don’t think using FALSE here is a problem, since I doubt is_bool would ever be added.
Regarding using a reference variable for the output, I don’t like that idea much. It doesn’t
chain very well… and would it fail a strict type hint, if we added that? Even if it somehow did, I
don’t think it is a good idea. Since I don’t think is_bool will happen, there’s also no real
need, either.
--
Andrea Faulds
http://ajf.me/