On Fri, Oct 12, 2012 at 10:58 AM, Christian Kaps
<christian.k...@mohiva.com> wrote:
> At the moment it isn't possible to restrict/define the arguments for a
> closure which is defined as parameter for a method. Please look at this
> small example.
>
> interface Broker {
>
>     public function scan(Request $request, Closure $onFound);
> }
>
> An implementation of the interface could be as follows:
>
> class BrokerImpl implements Broker {
>
>     /**
>      * @var Service
>      */
>     private $service = null;
>
>     public function scan(Request $request, Closure $onFound) {
>
>         if ($request->contains('some value')) {
>             $onFound($this->service);
>         }
>     }
> }
>
> The problem is that I can pass every closure to the scan method.
>
> $broker = new BrokerImpl();
> $broker->scan($request, function() { /* do something */ });
>
> Sometimes I would like to restrict the closure passed to this method. So
> that only closures of a certain type which has an argument "Service
> $service" could be passed to this method.
>
> $broker = new BrokerImpl();
> $broker->scan($request, function(Service $service) { /* do something */ });
>
> Would it not be possible to extend the Closure class and then define an
> abstract method signature for the __invoke method.
>
> class OnFoundClosure extends Closure {
>
>     public abstract function __invoke(Service $service);
> }
>
> And then you can define the interface as follows:
> interface Broker {
>
>     public function scan(Request $request, OnFoundClosure $onFound);
> }
>
> Now if you pass a closure to the scan method which doesn't follow the
> signature of the __invoke method, the engine should throw an error.
>
> What do you think?

Please also don't forget that PHP doesn't have strict function
signatures. E.g. you can write

    function($foo) {
        echo $foo;
    }

but you could also write

    function() {
        $foo = func_get_arg(0);
        echo $foo;
    }

So I'm not sure just how much sense function signature checking makes in PHP ;)

Nikita

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to