io la vedo che a volte preferisco un codice più snello ed agile nonchè facile da mantenere, portabile e/o scalabile, che uno 0.0002 sull'esecuzione finale.
Voglio dire, non è che la devi usare per ogni chiamata a funzione del tuo applicativo ... solo quando serve, lo davo per scontato ... ma ora c'è anche questa possibilità.
Non capisco questo terrore diffuso dei piaccapari sulla Reflection, voglio dire se avete paura delle performance avete sbagliato linguaggio a priori
ma la Reflection grazie a qualcuno esiste ed è capace di fare cose interessanti impensabili prima, fatte da anni con quasi tutti gli altri linguaggi.
Comunque per dover di cronaca, avevo scritto il tutto per le mie esigenze ma di fatto ho invertito gli argomenti 
nel senso che è più comoda da usare quando ci sono dei default da cambiare in fondo alla callback o al metodo ... ergo ho aggiornato le classi e per ottenere lo stesso risultato del primo esempio dovete usare rinvoke o rinvokeArgs invece di invoke ed invokeArgs
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($args, $this->args));
}
public function rinvoke($args){
$args = func_get_args();
return $this->rinvokeArgs($args);
}
public function rinvokeArgs(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($args, $this->args));
}
public function rinvoke($object, $args){
$args = func_get_args();
return $this->rinvokeArgs(array_shift($args), $args);
}
public function rinvokeArgs($object, array $args){
return parent::invokeArgs($object, array_merge($this->args, $args));
}
}
P.S. la r sta per metti gli argomenti ricevuti a destra ... di default li mette a sinistra permettendovi di snellire chiamate a metodi con un default che vorreste cambiare ...
codice:
function test($a, $b = 1, $c = 0){
return $a * $b + $c;
}
$ref = new ReflectionPartialFunction('test', 2, 1);
$ref->invoke(3); // 3 * 2 + 1
$ref->rinvoke(3); // 2 * 1 + 3