Am 12.10.2012 23:06, schrieb Nikita Popov:
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

What did you mean with strict function signatures?
Is this not a strict function signature?

function(Foo $foo) {}

Christian

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

Reply via email to