Page 1 of 1

Current PHP callables considered bad partice

Posted: Mon Dec 18, 2017 11:45 am
by VladSun
Several times we had issues with unit testing (and later in production code) classes that use callbacks - it's always the callback signature messed up while calling it. Unit tests could not help (at least not in a nice way) because the callbacks were mocked. Also the mocking of the callback is kind of an PITA.

It was pretty obvious that we need callable prototypes, but somehow it was declined (?!?).
So, eventually our team members agreed on that callables won't be used ever and "callable" interfaces will be created and required instead. Later, as PHP evolved, the anonymous classes where introduced which made our code much more readable.

Code: Select all

interface ITimerCallback {
  public function onTick(ITimer $timer);
}

interface ITimer {
  public function tick(ITimerCallback $handler);
}

...

$this->tick(new class implements ITimerCallback {
  public function onTick(ITimer $timer) {
    echo $timer->getTime();
  }
});

Just sharing :)

Re: Current PHP callables considered back partice

Posted: Mon Dec 18, 2017 2:17 pm
by Christopher
Nice solution. Thanks for sharing.

Re: Current PHP callables considered back partice

Posted: Mon Dec 18, 2017 6:00 pm
by requinix
VladSun wrote:It was pretty obvious that we need callable prototypes, but somehow it was declined (?!?).
PHP discusses everything publicly on their internals mailing list. Whenever you want to know what's going on, reading an archive of the emails is a great place to start.

AFAIK callable_types was supported in concept but had issues. Such as how it would be allowable to craft incredibly complex function signatures

Code: Select all

function foo(int $a, int $b, callable(callable(callable(callable(int, int):int $zebranky, int):int $pik, int):int $fot, int):int $zot): int {
    return $zot($a, $b);
}
And that default values in the signature would not be allowed

Code: Select all

function foo(callable(int = 123) $fn) {
And that it could create problems with strict_types and parameter variance.

In the rest of the OOP world, your problem is solved by interfaces or strict typing.

Re: Current PHP callables considered back partice

Posted: Mon Dec 18, 2017 9:50 pm
by Christopher
requinix wrote:In the rest of the OOP world, your problem is solved by interfaces or strict typing.
And indeed, the solution VladSun posted is to use interfaces...

Re: Current PHP callables considered back partice

Posted: Wed Jan 24, 2018 4:23 am
by VladSun
requinix wrote:In the rest of the OOP world, your problem is solved by interfaces or strict typing.
How To Save The Princess In 8 Programming Languages

Just for fun, no rant :)