Hey internals,

I wanted to ignite a friendly discussion whether PHP should allow typed
callable properties. The problem arises as typed properties RFC did not allow
the callable type [1] due to its context-dependent behaviour. As such, for
improving the language's consistency and adding support for strict callable
typing, I believe we should look into solutions for avoiding this special case.
Note that the solutions listed below are taken from the RFC and are thoughts
from Nikita Popov, so credits to him. Here is a quick summary of the
solutions:

1. Ignore the issue. At the moment, this is the behaviour that both parameter
and return type hints pose and I believe is also the best option for callable
properties. At least for the time being. Generally, this would increase
language's consistency and would also ensure that the type is actually *a*
callable. In the worst-case scenario, if the callable is not callable from this
context, PHP would still throw a runtime error.
2. Take visibility into account. We could allow making only typed
protected/private callable properties but this would create a quite tight
coupling between the visibility and type. It would also be a special case and
therefore a violation of the OCP principle.
3. We could automatically wrap assignments to typed callable properties into
Closure::fromCallable(). Though this would worsen the performance and add
additional overhead when using the callable type. As Nikita mentioned, if this
is the approach we're taking, we should also impose such conversion in every
place where the callable type may occur.
4. Perform type checks when reading. At the moment, we perform type checks only
when writing. We could change that and also perform type checks when reading.
Although this behaviour would be weird, as we would get a type error when
trying to read a typed callable property (e. g. ($this->callback)() would
throw a type error).

[1]: https://wiki.php.net/rfc/typed_properties_v2#callable_type

Best regards,
Benas Seliuginas
P.S.: If no one is interested in implementing this, I would be up for the job
if we make a consensus on what approach we should take.

Reply via email to