Callable type hint View as Markdown

Implemented (PHP 5.4)
Authors
Hannes Magnusson bjori@php.net
Date
2011-06-07
Version
1.0
Source
wiki.php.net/rfc/callable

Discussions on the mailing list

No thread found. Threads are linked to an RFC when their first email links to the RFC page, or when the RFC page links to them.

RFC text

Copied from wiki.php.net, last synchronized Oct 13, 2026 11:52 UTC

The problem

Frameworks have started to adopt Closures for callbacks, utilizing the 'Closure' typehint. That has an unfortunate sideeffect of requiring already-existing-methods to be wrapped into a closure calling that method. Additionally, the PHP documentation on closures indicates that the “Closure” class is considered an implementation detail, and may be subject to change in the future -- which means that typehinting on Closure may break in the future.

The solution

Introducing a callable typehint.

The typehint would allow a string with a function name, an array composed of classname/obj+methodname, and a closure.

Callable vs Callback

callback is callable, the opposite could not be true. A string, or a closure, is callable, but the string is not a callback.

The documentations already use `array` hinting when a function expects an array, even though it does not type hint on it. The documentations already use `callable` hiting when a function expects a callable instance, even though it does not type hint on it.

Furthermore we already have a function called is_callable(), and this new feature will share its implementation.

Introducing a different name (i..e callback) will therefore only create more inconsistencies and confusion.

The callable typehint reuses the is_callable() logic.

Initialization

Only null initialize is allowed, making it consistent with classname typehinting.

Patch

Previous discussions

Discussion summary
  • The only arguments against the idea came from Stas, making the argument;
    • 'callable' is a data structure not unlike 'balanced binary tree' and 'readable file', and none of them make sense have as a part of the language syntax. They belong in userspace.
    • A “strict typing error” is hard to handle in user-space gracefully.
  • Everyone else seem to like the idea, so far.
  • As for the patch itself, Felipe pointed out that the patch is missing an method in ext/reflection to retrieve the typehint information.
  • Things to finalize:
    • Reflection support
    • Arginfo support

Changelog

  • June 7th 2011, Initial writeup
  • July 27th 2011, Added “callable vs callback” and “initialization” section