请问我可以顶下吗?除了用eval还有没有更好的办法

解决方案 »

  1.   

    function f() {
      call_user_func_array( 'ff', func_get_args() );
    }
      

  2.   

    老大,,其实我想实现
    new $className(可变参数)这个是我用eval写的$numArgs = func_num_args();
    if ($numArgs > 4) {
    $paras = array();
    $argList = func_get_args();
    $len = count($argList);
    for ($n=4; $n < $len; $n++) {
    $paras[] = "argList[$n]";
    }
    $para = implode(',', $paras);
    return "new $className($paras);";
    } else {
    return new $className();
    }
      

  3.   

    你的问题提的有点问题:调用函数和创建对象是绝不相关的两回事
    另外,你最后给出的示例代码也是错误多多eval 方案:
    class TA {
      var $a = '';
      var $b = '';
      var $c = '';  function TA($a,$b,$c) {
        foreach($this as $k=>$v) {
          $this->$k = $$k;
        }
      }
    }class TB {
      function TB() {
        $this->name = get_class();
      }
    }function foo($classname) {
      if(func_num_args() > 1) {
        $ar = array_slice(func_get_args(), 1);
        return eval("return new $classname('".join("','", $ar)."');");
      }else {
        return new $classname();
      }
    }
    $p = foo('TA',1,2,3);
    print_r($p);
    $p = foo('TB');
    print_r($p);另一种可行方案(仅供参考)
    class TA {
      var $a = '';
      var $b = '';
      var $c = '';  function TA($a='',$b='',$c='') {
        foreach($this as $k=>$v) {
          $this->$k = $$k;
        }
        return $this;
      }
    }class TB {
      function TB() {
        $this->name = get_class();
      }
    }function foo($classname) {
      if(func_num_args() > 1) {
        $ar = array_slice(func_get_args(), 1);
        return call_user_func_array(array(new $classname, $classname), $ar); 
      }else {
        return new $classname();
      }
    }
    $p = foo('TA',1,2,3);
    print_r($p);
    $p = foo('TB');
    print_r($p);