Empower Callables with Function Signature Hints

php.internals

Unnamed Person

5 years ago
Hello Internals, I want to request making possible to catch functions with wrong signature when passed as callable. In other words, when a function or a method is passed as callable value, PHP will first confirm whether the function is of the write callable type that the function being executed requires. It will help catch silent errors. Currently, PHP does following: 1. Confirms whether a callable is valid. 2. Passes the callable value to a function, and the execution starts. 3. If the passed function receives values which's type is different than function signature, PHP throws an error. 4. If passed function returns nothing, the variable that wanted a value from the passed function receives null. 5. As a result, the unexpected results emerge. To resolve this issue, I propose to introduce a mechanism that allows to hint callable signatures. To understand the spirit of this request, look at the similar functionality that Angel Script Project provides with. 1. One defines a function definition. 2. Use its name to hint the same signature. 3. The compiler alerts about the incorrect signature before passing this to a function. If I could do this in PHP, I would write like following: `funcdef preg_replace_callback_hint(array $matches) : string;` If I accidently pass a callable which's signature is different than desired function call, the error is caught earlier. This message does not suggests syntax; it only points to a problem and suggests a solution. Any volunteers that would love to come up with syntax and implement this? I am curious to see the feedback. Regards Hamza Ahmad

azjezz

5 years ago
Hello Hamza, I think this is something that has been discussed here before. function types already exist in HackLang: https://docs.hhvm.com/hack/functions/introduction#function-types, And, if we would follow the same syntax `(function(T, T): T)` or `(callable(T, T): T)`, PHP needs to first support parentheses in type declaration ( grouping ), which currently it doesn't ( i.e: `function baz((string|bar) $foo): void {}` becomes valid ). And just to note, function types are also supported by static analysis tools such as Psalm ( https://psalm.dev/docs/annotating_code/type_syntax/callable_types/ ) and PHPStan ( https://phpstan.org/writing-php-code/phpdoc-types#callables ), so i suppose if PHP is to support typed callables, it should take inspiration from these tools. There's also an alternative syntax that was proposed back in 2016 for PHP 7.1, but it seems like the RFC was abandoned: https://wiki.php.net/rfc/typesafe-callable Cheers, Saif. ‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐ On Wednesday, April 7, 2021 11:58 AM, Hamza Ahmad <office.hamzaahmad@gmail.com> wrote:

Unnamed Person

5 years ago
Hello, I thanks Saif for adding to my argument and providing with the list of other languages/tools that support such a functionality. As Saif has mentioned about "typesafe callables" RFC that is now inactive, I want to also point out toward another rfc that was declined. It was Callable Prototype RFC that had sought for the similar functionality. https://wiki.php.net/rfc/callable-types Python also provides with a library ever since 3.5: https://docs.python.org/3/library/typing.html After looking at the prior RFCs, I feel like that it requires a fresh discussion. Because there are several syntax to choose from, a separate vote will only be held for this. Best Hamza Ahmad On 4/7/21, Saif Eddin Gmati <azjezz@protonmail.com> wrote: