See #4003 and #4009 for some context. In short, since the PHP language itself as well as its community are moving to (optional) stricter typing, it makes sense for Twig to support this as well by adding a types tag.
@fabpot said he'd like to bootstrap a spec. This is the first draft. Everything is up for debate, obviously. In addition, I've put in italics parts of the spec that I have doubts about myself.
Given the discussions below (thanks all for contributing), I think the spec is now crystallizing. Consider it a beta.
Syntax
The types tag contains a mapping of variable name to constant type string (no expression or interpolation):
{% types {variable: 'Type'} %}
The reason for quoting the type is that several characters (e.g., \) are currently not supported by the Lexer. It also allows analyzer implementations to freely specify the syntax.
The variable name must not be quoted. This is to ensure that only valid names can be used.
Types
The syntax and content of the types are not part of this specification. This provides complete freedom to extensions that inspect and analyze the tags. It also keeps the implementation in Twig very simple and robust.
(In practice, it's likely that implementations will rely on widely-used specifications like PHPDoc / PHPStan types.)
Examples
Here are two examples:
{% types {foo: 'bool'} %}
{% types {
bar: "list<int>",
baz: '?\Name\Space\ClassName'
} %}
Behavior
This specification does require any behavior other than validating the syntax for the tag itself. The tag does not lead to generated PHP code.
Usage
This section describes possible implementations to demonstrate the utility of this addition.
It is up to extensions developed by the community to implement any of this.
Development time
The types can be useful during development by enabling IDEs to auto-complete code, issue warnings, and more.
This is already implemented by the Symfony Support plugin for PHPStorm when using comments to declare variable types (e.g., {# @var id int #}).
These tags also provide precious documentation about the variables expected in a template's context.
Compile time
During compilation, a Twig extension can:
- Check the type and throw an appropriate Exception if it is not valid.
- For objects, check whether properties and more methods exist, and throw an appropriate Exception if there is none.
- Add run-time checks (see below).
Run time
During run time, behavior may depend on strict_variables environment option:
- If disabled (likely in production environments), a PHP warning is triggered.
- If enabled, (development and testing environments), an Exception is thrown.
Possible extensions
See #4003 and #4009 for some context. In short, since the PHP language itself as well as its community are moving to (optional) stricter typing, it makes sense for Twig to support this as well by adding a
typestag.@fabpot said he'd like to bootstrap a spec. This is the first draft. Everything is up for debate, obviously. In addition, I've put in italics parts of the spec that I have doubts about myself.Given the discussions below (thanks all for contributing), I think the spec is now crystallizing. Consider it a beta.
Syntax
The
typestag contains a mapping of variable name to constant type string (no expression or interpolation):The reason for quoting the type is that several characters (e.g.,
\) are currently not supported by the Lexer. It also allows analyzer implementations to freely specify the syntax.The variable name must not be quoted. This is to ensure that only valid names can be used.
Types
The syntax and content of the types are not part of this specification. This provides complete freedom to extensions that inspect and analyze the tags. It also keeps the implementation in Twig very simple and robust.
(In practice, it's likely that implementations will rely on widely-used specifications like PHPDoc / PHPStan types.)
Examples
Here are two examples:
{% types {foo: 'bool'} %} {% types { bar: "list<int>", baz: '?\Name\Space\ClassName' } %}Behavior
This specification does require any behavior other than validating the syntax for the tag itself. The tag does not lead to generated PHP code.
Usage
This section describes possible implementations to demonstrate the utility of this addition.
It is up to extensions developed by the community to implement any of this.
Development time
The types can be useful during development by enabling IDEs to auto-complete code, issue warnings, and more.
This is already implemented by the Symfony Support plugin for PHPStorm when using comments to declare variable types (e.g.,
{# @var id int #}).These tags also provide precious documentation about the variables expected in a template's context.
Compile time
During compilation, a Twig extension can:
Run time
During run time, behavior may depend on
strict_variablesenvironment option:Possible extensions
twig_get_attribute()to improve performance. (see Prevent calling twig_get_attribute by generating the guessed PHP code instead #3928)