Inline typecasting / typehinting for classes and interfaces
| From: | Stan Vass | Date: | Tue, 14 Aug 2012 07:46:26 +0000 |
| Subject: | Inline typecasting / typehinting for classes and interfaces | ||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-62136@lists.php.net to get a copy of this message | ||
I've felt the need for this for some time.
Proposed syntax:
-------------------------
$x = (InterfaceName) $container->service;
Proposed behavior:
---------------------------
Checks if the instance if an instance of the given class/interfaces. If yes, does nothing, if not,
issues a fatal error. Pseudo code:
$temp = $container->service;
if ($temp instanceof InterfaceName) {
$x = $temp;
} else {
trigger_error('The object can not be cast to InterfaceName');
}
Use cases:
----------------
As my example hints, the intent is to provide type safety and hinting for the increasingly used
dependency injection container pattern.
It's useful to provide type safety also for all similar patterns which may not return a result
of the expected type: Registry, ServiceLocator, Factory etc.
Additionally to runtime type safety, this will also serve to editors/IDEs as an inline hint to
provide proper autocompletion, i.e. instead of this:
/** @var $foo InterfaceName */
$foo = $container->service;
People can now just write:
$foo = (InterfaceName) $container->service;
Alternative syntax:
--------------------------
I realize "casting" isn't a perfect match as the behavior is equivalent to inline
type hinting. On the other hand, casting and inline type hinting in dynamic languages often behave
identically (see the casting behavior in ActionScript which combines type hints with a JS-like
dynamic type system).
And this syntax doesn't introduce new keywords. Still, alternative ways to implement this could
be:
1. $foo = $container->service as InterfaceName;
2. $foo = $container->service is InterfaceName;
3. $foo = (InterfaceName $container->service);
4. InterfaceName $foo = $container->service;
All of those would be fine, especially 4, which has precedent in other languages, and in PHP as well
with typehinting and in catch blocks: catch (ClassName $e) { ... }
I'm ok with suggestions for any syntax that is as short, if it fits the behavior better.
Feedback?
Stan