PHP函数参数 - 是否使用数组?

eth*_*pil 10 php arrays arguments function

我喜欢使用key => value pairs(数组)作为参数而不是单个参数来创建我的PHP函数.

例如,我更喜欢:

function useless_func($params) {
    if (!isset($params['text'])) { $params['text'] = "default text"; }     
    if (!isset($params['text2'])) { $params['text2'] = "default text2"; }   
    if (!isset($params['text3'])) { $params['text3'] = "default text3"; }   
    echo $params['text'].$params['text2'].$params['text3'];
    return;
}
Run Code Online (Sandbox Code Playgroud)

我不喜欢:

function useless_func($text = "default text", $text2 = "default text2", $text3 = "default text3") {
        echo $text.$text2.$text3;
    return;
}
Run Code Online (Sandbox Code Playgroud)

我第一次看到在Wordpress代码库中广泛使用这种方式完成的事情.

我更喜欢数组的原因:

  • 函数参数可以按任何顺序提供
  • 更容易阅读代码/更多自我记录(在我看来)
  • 不容易出错,因为在调用函数时我必须调查正确的数组键

我正在与同事讨论这个问题,他说它没用,只会导致额外的代码,而且设置默认值要困难得多.基本上,他完全不同意我的所有三点.

我正在寻找可能提供见解的专家的一般建议和指导:有什么更好或更正确的方法来做到这一点?

dev*_*Rew 15

嗯,这有点有用.但是对于一些经常传递的论据,最好使用经典的传球function some($a1, $a2).我在我的代码中这样做:

function getSome(SomeClass $object, array $options = array())
{
    // $object is required to be an instance of SomeClass, and there's no need to get element by key, then check if it's an object and it's an instance of SomeClass

    // Set defaults for all passed options
    $options = array_merge(array(
        'property1' => 'default1',
        'property2' => 'default2',
        ... => ...
    ), $options); 
}
Run Code Online (Sandbox Code Playgroud)

所以,你可以看到我也喜欢那种代码风格,但是对于核心参数我更喜欢经典风格,因为如果我使用你的代码风格,PHP会控制更多的东西.


Fél*_*ier 13

不要那样做!

在大多数情况下,将所有数据传递到数组中是个坏主意.

  • 它可以防止人们在不知道操作需要的情况下使用您的功能.
  • 它允许您创建需要大量参数的函数,可能您应该创建一个具有更精确的参数需求和更窄目标的函数

在功能中注入它需要的东西似乎相反.

函数参数可以按任何顺序提供

我没有这样的偏好.我不明白这个需要.

更容易阅读代码/更多自我记录(在我看来)

大多数IDE将为您提供函数所需的不同参数.如果看到一个函数声明,就像foo(Someclass $class, array $params, $id)它非常清楚函数需要什么.我不同意单个参数论证更容易阅读或自我记录.

不容易出错,因为在调用函数时我必须调查正确的数组键

允许人们在不知道值将被默认的情况下传入数组并不接近"不容易出错".让人们在使用它之前必须阅读你的功能是一种永远不会被使用的可靠方法.声明它需要三个参数及其默认值是容易出错的,因为调用函数的人将知道参数将默认为哪些值,并相信它将呈现他们期望的结果.


如果您要解决的问题是参数太多,那么正确的决定是将您的函数重构为较小的函数,而不是隐藏数组后面的函数依赖项.


Squ*_*uig 9

我假设你问的是,编写所有函数是否是一件好事,以便它们只接受一个参数,并且该参数是一个数组?

如果你是唯一一个能够使用你的代码的人,那么你可以做你喜欢的事.但是,通过将所有参数值传递给数组,其他任何人都必须更加努力地了解函数的作用以及它们为何/如何使用它,特别是如果它们使用具有自动完成功能名称的IDE他们并没有把它称为"功能签名".

我建议数组参数保留用于你不知道有多少项的项目(例如一系列数据项),或者用于相关选项/设置组(可能是Wordpress中正在发生的事情)你提到的例子?).

如果你继续采用数组参数的一揽子方法,那么你至少应该意识到它对可读性的影响,并采取一些措施来解决这个问题.


Jac*_*ack 5

你的同事是对的.它不仅是相同功能的更多代码,更难以阅读并且可能降低了性能(因为您需要调用isset每个参数,并且您需要访问数组来设置值).


liq*_*car 5

这与Cargo Cult 编程接壤。你说这更具可读性和自我记录性。我想问怎么办?要知道如何使用您的函数/方法,我必须阅读代码本身。我无法从签名本身知道如何使用它。如果您使用任何支持方法签名提示的半体面的 IDE 或编辑器,这将是一个真正的 PITA。此外,您将无法使用 PHP 的类型提示语法。

如果您发现您正在编写大量参数,尤其是可选参数,则表明您的设计可能存在问题。考虑一下你还能怎么做。如果部分或全部参数相关,则它们可能属于它们自己的类。