search

Home  >  Q&A  >  body text

php 函数参数过多时,如果用字符串代替效率怎么样?

1:function fn( $name , $age , $sex , $height , $weight . . . ){

} // 如果有 10+ 个参数

2:function fn( $str ){

$str_arr = explode( "@" , $str ) ;

} // 用explode再把参数都拆开

(因为我感觉传入一个数组应该比一个字符串占的空间大)

第一种参数过多,用第二种代替,不知道这样做效率会不会好些,望解答

迷茫迷茫2789 days ago745

reply all(10)I'll reply

  • 怪我咯

    怪我咯2017-04-11 10:22:03

    看你的php版本吧,如果你能控制参数的变化情况,php5.6开始是支持可变参数的,比如这种:

        /**
         * @see 可变数量的参数列表
         * 因函数调用顺序和类型,需要使用可变参数类型的传入形式,或者直接使用func_get_args
         *
         * @link http://php.net/manual/zh/functions.arguments.php#functions.variable-arg-list
         *
         * @param array ...$_p 可变参数列表
         * @return mixed
         * @throws Exception
         */
        protected function request(...$_p)
        {
            // 无效请求
            if (!count($_p)) {
                throw new Exception("empty params\n");
            }
    
            $actionName = array_shift($_p);
    
            // 记录日志用
            $p_ = implode(',', $_p);
            do {
                try {
                    $response = json_decode(call_user_func_array([self::$_client, $actionName], $_p), true);
                    if (isset($response['code']) && $response['code'] == 0) {
                        return $response['data'];
                    }
                    error_log("{$this->serviceName}->{$actionName}({$p_}) Error Times({$this->times}) Message: {$response['message']}");
                } catch (Exception $e) {
                    error_log("Exception Times({$this->times}), {$this->serviceName}->{$actionName}({$p_}): {$e->getMessage()}");
                    sleep(2);
                }
            } while ($this->times--);
            throw new Exception("{$this->serviceName}->{$actionName}({$p_}) Repeat Failed\n");
        }

    这是我自己用的,就是这么个意思。php5.6之前的版本就用func_get_args这个。就不需要写一大堆参数列表了。

    reply
    0
  • 怪我咯

    怪我咯2017-04-11 10:22:03

    明显传过去一个数组可读性要高很多啊

    fn( [
      'name' => '',
      'age' => 10,
      'sex' => MALE,
      'height' => 180,
      'weight' => 110,
      ....
    ]);

    reply
    0
  • PHP中文网

    PHP中文网2017-04-11 10:22:03

    这就好比马云想买一瓶水,有一瓶三元有一瓶是两元的,你告诉马云买两元的吧,更省钱。

    reply
    0
  • 迷茫

    迷茫2017-04-11 10:22:03

    用@作分隔符到时候参数带@就不好办了啊

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-11 10:22:03

    为什么不传一个数组呢

    reply
    0
  • PHPz

    PHPz2017-04-11 10:22:03

    可以直接定义一个类,传进去一个对象

    reply
    0
  • 阿神

    阿神2017-04-11 10:22:03

    传数组 不过传字符串的话单纯@符号分割 也是需要对每个参数位置进行限定吧 这样感觉还不如直接传单个参数?

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-11 10:22:03

    一般用数组,否则你就要反思下你这个方法存在的必要性了

    reply
    0
  • 怪我咯

    怪我咯2017-04-11 10:22:03

    数组传,或是php5.6+的支持可变参数

    reply
    0
  • PHP中文网

    PHP中文网2017-04-11 10:22:03

    https://segmentfault.com/q/10...

    reply
    0
  • Cancelreply