PHP 5.2 中实现partial参数绑定

在闭包不存在的情况下,实现部分参数绑定的一个替代品……

首先举例partial/curry

 

  1. def add(a,b):
  2.     return a+b
  3. def add_a(b):
  4.     def ad(a):
  5.         return a+b
  6.     return ad
  7. print add(1,2# 3
  8. add_1 = add_a(1)
  9. add_2 = add_a(2)
  10. print add_1(2# 3
  11. print add_2(2# 4

下面在php中实现类似功能

 

  1. function bind($funcarray $params)
  2. {
  3.     $reflect = new ReflectionFunction($func);
  4.     $funParams = $reflect->getParameters();
  5.     $paramsDeclare = array();
  6.     $paramsInvoke = array();
  7.     $paramsRestore = array();
  8.     foreach ($funParams as $i => $p)
  9.     {
  10.         /*@var $p ReflectionParameter*/
  11.         if(array_key_exists($i$params)){
  12.             $paramsRestore[] = "/${$p->getName()} = unserialize('" . serialize($params[$i]) . "');"
  13.         }else {
  14.             $string = ReflectionParameter::export($func$p->getName(), true);
  15.             $paramsDeclare[] = preg_replace('(^[^/[]*/[ |or NULL | /]|<optional> )'''$string);
  16.         }
    •         $paramsInvoke[] = '$' . $p->getName();
    •     }
    •     $clauseRestore = implode("/n"$paramsRestore);
    •     $clauseInvoke = implode(","$paramsInvoke);
    •     $clauseDeclare = implode(","$paramsDeclare);
    • //  echo nl2br("create_function(/"$clauseDeclare/", /"$clauseRestore;/nreturn $func($clauseInvoke);/");");
    •     return create_function($clauseDeclare"$clauseRestore;/nreturn $func($clauseInvoke);");
    • }

用法如下:

  1. function testfun($arg1 = "sdf", ReflectionFunction $objArg = null, Array $arrayArg = null){
  2.     echo $arg1;
  3.     var_export($objArg);
  4.     echo $arrayArg;
  5. }
  6. $a = bind('testfun'array(0=> 'cat', 1=> new ReflectionFunction('run'), 2=> array('sdf' => true)));
  7. $a();

bind function好丑啊~~愁死我了……php啊php……

 

----------------------------------------------------------------------------

 

这里的评论里看到一个实现:

 

  1. function curry($funcName) {
  2.     $inArgs = array_slice(func_get_args(), 1);
  3.     $serInArgs = serialize($inArgs);
  4.     
  5.     $rfunc = new ReflectionFunction($funcName);
  6.     $funcArgs = $rfunc->getParameters();
  7.     
  8.     $curriedArgs = array_slice($funcArgscount($inArgs));
  9.     foreach ($curriedArgs as $i=>$arg) {
  10.         $curriedArgs[$i] = '$'.$arg->getName();
  11.     }
  12.     $curriedArgs = implode(', '$curriedArgs);
  13.     
  14.     return create_function(
  15.         $curriedArgs,
  16.         '
  17.         $rfunc = new ReflectionFunction("'.$funcName.'");
  18.         $args = func_get_args();
  19.         $applyArgs = unserialize("'.str_replace('"', '//"', $serInArgs).'");
  20.         settype($applyArgs"array");
  21.         foreach ($applyArgs as $arg) {
  22.             array_unshift($args$arg);
  23.         }
  24.         return $rfunc->invokeArgs($args);
  25.         '
  26.     );
  27. }

在这里看到另一个美一些的实现:

 

  1. function partial()
  2. {
  3.     if(!class_exists('partial'))
  4.     {
  5.         class partial{
  6.             var $values = array();
  7.             var $func;
  8.             function partial($func$args)
  9.             {
  10.                 $this->values = $args;
  11.                 $this->func = $func;
  12.             }
  13.             function method()
  14.             {
  15.                 $args = func_get_args();
  16.                 return call_user_func_array($this->func, array_merge($args$this->values));
  17.             }
  18.         }
  19.     }
  20.     //assume $0 is funcname, $1-$x is partial values
  21.     $args = func_get_args();   
  22.     $func = $args[0];
  23.     $p = new partial($funcarray_slice($args,1));
  24.     return array($p'method');
  25. }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值