微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用PHP将多个变量传递给函数的最佳实践是什么

我有一个带5个参数的函数,随着应用程序的增长,我们需要添加更多的参数,这些参数最终有9个参数,其中4个参数有认值.

我想知道传递这样的参数或使用数组更好吗?

我更喜欢这样

fun(array(
     'par1' => 'x','par2' => 'y',.....
    )
 )

绝缘

func($par1,$par2,$par3,...);

你怎么看?

在很大程度上取决于用例.

但是这里有一些解决这个问题的方法.

固定订单

如果订单有些修复而你永远不需要改变它,那么:

<?PHP

function fn($a1,$a2,$a3,$a4,$a5,$a6 = null,$a7 = "foo",$a8 = "bar",array $a9 = array()) {}

优点

>自我记录
>类型提示
>认值

缺点

>固定订单

排列

另一方面,如果订单总是有些不同,请使用数组thingy.

<?PHP

function fn($a1,array $optional = array()) {}

fn("","",array("arg9" => false));

优点

>易于使用
>没有固定的订单

缺点

>不是自我记录
>验证成本高昂

参数对象

参数对象当然也是一种有效的解决方案,但处理起来却不切实际:

<?PHP

class Args {

  public $arg5 = "foo";

  public $arg6 = "bar";

  public $arg7 = null;

  public $arg8 = array();

  public $arg9 = true;

}

function fn($arg1,$arg2,$arg3,$arg4,$arg5,\Args $optional = null) {}

// Now comes the impractical part.
$optional = new Args();
$optional->arg9 = false;
fn("",$optional);

优点

>自我记录
>没有固定的订单

缺点

>非常不切实际
>验证成本高昂

数组到参数对象

你可以混合两种方法

<?PHP

class Args {

  public $arg5 = "foo";

  public $arg6 = "bar";

  public $arg7 = null;

  public $arg8 = array();

  public $arg9 = true;

  public __construct($args) {
    foreach ($args as $property => $value) {
      $this->"set{$property}"($value);
    }
  }

  public function setArg5($value) {
    if (is_string($value) === false) {
      throw new \invalidargumentexception;
    }
    $this->arg5 = $value;
  }

  // and so on ...

}

function fn($arg1,array $optional = null) {
  if (isset($optional)) {
    $optional = new Args($optional);
  }
  // ...
}

fn("",array("arg9" => false));

优点

>简单验证
>分离关注
>容易传递
>易于处理
>可以记录API

缺点

>仍然无法将其记录为固定的args方法
>验证成本高昂

Variadics

PHP 5.6中有一个你可能会觉得有用的新功能,variadics

<?PHP

function fn($a1,...$optional) {}

优点

>非常快
>允许构建特殊的API(例如数据库预处理语句绑定)

缺点

>不容易记录
>验证成本高昂

命名参数

我们将来可能会看到named parameters.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口。下面介绍的是其中NATIVE的支付实现流程与PC端实现扫码支付流程
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口。下面介绍的是其中APP的支付的配置与实现流程
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户信息这个功能的开发流程。 配置 1.首先得在微信公众平台申请一下微信小程序账号并获取到小程序的AppID和AppSecret https://mp.weixin.qq.com/cgi-bin/loginpage?url=%2Fwxamp%2F
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一款开源且免费商用的后台开发框架,它基于ThinkPHP和Bootstrap两大主流技术构建的极速后台开发框架,它有着非常完善且强大的功能和便捷的开发体验,使我逐渐喜欢上了它。
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛,就离不开通讯了,然后我就想到了长连接。这里本人用的是GatewayWorker框架。
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口。下面介绍的是其中JSAPI的支付实现流程
服务器优化必备:深入了解PHP8底层开发原理
Golang的网络编程:如何快速构建高性能的网络应用?
Golang和其他编程语言的对比:为什么它的开发效率更高?
PHP8底层开发原理揭秘:如何利用新特性创建出色的Web应用