PHP函数数组默认值是什么?

5

我有一个包含数组的PHP函数。我将数组放在函数内部,以便参数是可选的,这些参数将成为默认值。例如:

/**
 * Creates New API Key
 *
 * @return Response
 */

public function create(
    $data = [
        "user-id" => Auth::id(),
        "level" => '1',
        "ignore-limits" => '0',
    ]){
    ...
}

然而我一直收到这个错误:

语法错误,意外的 '(', 预期 ']'

因此我认为在构造函数时不能像这样传递数组。有没有更好的方法来处理这个问题或进行修复?


你的问题在于函数调用!你不能使用“动态”数据设置默认参数。 - Rizier123
是的 ^ 但是很好的思考 - kevingilbert100
我会使用依赖注入。传递一个类型为 apiKeyConfig 的对象或类似的东西,其中apiKeyConfig需要你提到的参数,然后对该参数进行类型提示,要求参数必须是 apiKeyConfig的实例。 - Charlie Schliesser
3个回答

5

函数参数的默认值只能使用标量类型。

您也可以在手册中阅读此内容:http://php.net/manual/zh/functions.arguments.php#functions.arguments.default

以下是其中的一句话:

默认值必须是常量表达式,而不是变量、类成员或函数调用等

编辑:

但是,如果您仍然需要将该值作为数组的默认值,则可以执行以下操作:

使用一个占位符,在默认数组被使用时,您可以使用 str_replace() 来替换它。这样做的优点是,如果您需要在默认数组中多次使用该函数的返回值,您只需要使用相同的占位符,两者都将被替换。

public function create(
    $data = [
        "user-id" => "::PLACEHOLDER1::",
                    //^^^^^^^^^^^^^^^^ See here just use a placeholder
        "level" => '1',
        "ignore-limits" => '0',
    ]){
    $data = str_replace("::PLACEHOLDER1::", Auth::id(), $data);
          //^^^^^^^^^^^ If you didn't passed an argument and the default array with the placeholder is used it get's replaced
    //$data = str_replace("::PLACEHOLDER2::", Auth::id(), $data); <- AS many placeholder as you need; Just make sure they are unique
    //...
}

另一个想法是设置一个默认的数组,你可以检查一下,然后像这样分配真实的数组:

public function create($data = []){
    if(count($data) == 0) {
        $data = [
            "user-id" => Auth::id(),
            "level" => '1',
            "ignore-limits" => '0',
        ];    
    }
    //...
}

你会推荐这个解决方案而不是其他问题中的解决方案吗? - kevingilbert100
1
@kmgilbert100 在这两个答案中,您必须确保占位符是唯一的。我在这里看到的优点是,您可以多次使用占位符,而且您不需要为每个占位符编写if语句。(我刚刚添加了另一个示例,我认为这可能是最好的解决方案,因为如果您传递一个空数组,您就不必检查它) - Rizier123
1
看起来这是一个更好的解决方案,我喜欢它,谢谢! - kevingilbert100
其实只是在思考,第二个选项可能行不通,因为如果我只想传递用户ID而不是级别和忽略限制,那么只传递一个参数是否会消除默认的级别和忽略限制值呢? - kevingilbert100
@kmgilbert100 您的意思是,如果传递的数组只有2个元素,它就不会选择默认数组了吗? - Rizier123
显示剩余2条评论

1
这里的问题是:
Auth::id()

这会调用一个在此上下文中不合法的方法。
我会这样解决:
public function create(
    $data = [
        "user-id" => -1,
        "level" => '1',
        "ignore-limits" => '0',
    ]){
    if($data['user-id'] === -1) {
        $data['user-id'] = Auth::id()
    }
    ...
}

我需要这个函数在默认值内,最好的方法是在函数内部执行数组合并,并将$data默认设置为null吗? - kevingilbert100

0
更通用的解决方案是使用array_merge。这样,您可以重写任何参数,而无需逐个检查它们。
function create($somthing, $settings = [])
{
    $default = [
        'date' => date("Y-m-d H:i:s"),
        'bold' => false,
        'italic' => false,
    ];
    $settings = array_merge($default, $settings);
    ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接