La butto qui

ho trovato interessante questo post di John Resig sulle funzioni parziali in JavaScript.

Magari vi sembrera' un'assurdita', ma per un problema al lavoro ho pensato di sfruttare la stessa tecnica, peccato che il linguaggio sia PHP.

A volte PHP e' comunque piu' flessibile di quello che si pensa (almeno di quello che IO penso).
Ecco il risultato:

codice:
class ReflectionPartialFunction extends ReflectionFunction {

    protected   $args;

    public  function    __construct($name){
        parent::__construct($name);
        $this->args = func_get_args();
        array_splice($this->args, 0, 1);
    }

    public  function    invoke($args){
        $args = func_get_args();
        return  $this->invokeArgs($args);
    }

    public  function    invokeArgs(array $args){
        return  parent::invokeArgs(array_merge($this->args, $args));
    }
}

class ReflectionPartialMethod extends ReflectionMethod {

    protected   $args;

    public  function    __construct($class, $name){
        parent::__construct($class, $name);
        $this->args = func_get_args();
        array_splice($this->args, 0, 2);
    }

    public  function    invoke($object, $args){
        $args = func_get_args();
        return  $this->invokeArgs(array_shift($args), $args);
    }

    public  function    invokeArgs($object, array $args){
        return  parent::invokeArgs($object, array_merge($this->args, $args));
    }
}
Ed ecco un paio di tests facili facili:
codice:
function    mul($fixedParam, $num){
    return  $fixedParam * $num;
}

class Test{
    protected   $num;
    public  function    __construct($num){
        $this->num  = $num;
    }
    public  function    me($fixedParam, $num){
        return  $this->num * $fixedParam * $num;
    }
}

$partial = new ReflectionPartialFunction('mul', 12);
echo    $partial->invoke(2);                // 24

$partial = new ReflectionPartialMethod('Test', 'me', 12);
echo    $partial->invoke(new Test(2), 2);   // 48
A voi trovarne applicazioni