Hi Internals,

Stanislav Malyshev wrote:
> every PHP function actually returns
> something (at least null). So this type would not actually be right and
> would not reflect what actually is happening.

Well obviously we would need to have a followup RFC to make void
functions not have a usable return value! /s

I drafted this email a week ago and didn't send it as I though it was
too snarky to be a useful thing to add to the conversation, but it
seems that it has come up:

François_Laupretre wrote:
> Is it too late to add a note in the RFC, listing the possibility, in the
> future, to forbid using the result of void functions in expressions.

This is an idea that this RFC obviously leads to, but one that is very bad.

Being able to call a function dynamically and not need to determine
whether it is 'void' return type eliminates a whole class of errors
that can occur when calling code dynamically.

function timeFoo(callable $fn) {
    startTime();
    $result = $fn();
    endTime();

    return $result;
}

This can be done without any inspection on what the return type of
`$fn` is, and is one of the things that PHP got right.

And yes, if we don't make that change, using the pseudo-type of 'void'
instead of 'null' is going to be an instant source of PHPSadness.

Q: This function has a 'void' return type but it's actually returning null?
A: Yes.
Q: Shouldn't it have a 'null' return type?
A: Apparently they chose to make the language follow the manual rather
than make the manual follow the language.
Q: ...Is it too early to start drinking yet?

Tring to 'clean this up' by preventing a void function being used as
an expression, is an example of making the program follow the PHP
manual's convention, rather than making the manual document what the
engine does.

Levi Morrison wrote:
> This is one reason I am in favor of `null`
> instead of `void`. Void does not accurately portray the semantics in
> my opinion. If the return type was null instead of void there would be
> no issue. Sure, the return value would be null, but partialLeft
> doesn't care – it just passes whatever the result was.

I think this is an important point, and so to try and expand on this a
bit; if you have a function that does not return a value or has a
void/null return type, then this code:

logResult(foo());

is valid.

The person who wrote the function 'foo' might not anticipate that the
function would be used in that way but that is valid code. It is only
when you actually try to use the value as anything other than null
that it becomes a problem i.e.

function findUserbyId(int $userId) {...}
findUserbyId(foo());

it's when you pass the null value to function that needs a non-null
value that the error occurs.

Although alerting someone that they are using a null value where they
actually need another type is a useful thing, we do not need another
type (or pseudo-type) to do this. We should add null as a return type
rather than void as null:

* accurately describes what is happening in the engine, instead of
being an instant source of confusion.
* is compatible with the proposed 'nullable return types' and/or
'union types', void isn't.
* avoids adding a new pseudo-type just for a single use case.

cheers
Dan

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to