Hi,
maybe with short closures this will be pretty easy to implement by injecting a short closure that expects the return type to be of the type to be casted and to return it.

Something in the like of :

$service = (fn(EmailService $s):EmailService => $s ;)($diContainer->get('email.service'));

Not that I support pulling services from a container most often being an anti-pattern.

Cheers,
Andrey

On 23.04.19 г. 0:47 ч., Benjamin Morel wrote:
Hi internals,

I'd like to revive an old discussion <https://externals.io/message/67131> about
object type casting.

The idea would be to allow (ClassName) casting:

     $service = (EmailService) $diContainer->get('email.service');

The above code would throw a TypeError if the value is not an instance of
the given class. I see the following advantages:

- Type safety: we can be sure that the value is of the correct type or that
we'll get an Error. This syntax allows to fail early if the variable
happens to not be of the expected type, and avoids much more verbose checks;
- Static analysis: IDEs and static code analysis tools can now understand
the type of the variable, without having to resort to `@var` annotations.

These combine into a third advantage: readability. Today's equivalent of
the above one-liner could be:

     /** @var EmailService $service */
     $service = $diContainer->get('email.service');
     if (! $service instanceof EmailService) {
         throw new TypeError('Expected instance of EmailService, ...');
     }

Which is a lot of boilerplate code that could be easily avoided by
introducing this new syntax.

Before moving forward and working on a formal RFC, I'd like to hear your
thoughts: what's your early feeling about this? Did I miss other
discussions around this subject? Are there any technical issues that come
to mind? Could this feature help the upcoming JIT compiler produce more
efficient machine code by knowing the type of the variable at compile time?
etc.

Note: "casting" might not be the perfect name here as what we're really
doing is a type check, but this reuses the type casting syntax and
resembles Java's object casting.

Thank you,
Ben



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

Reply via email to