【问题标题】:PHP Function Array Default Values? [duplicate]PHP函数数组默认值? [复制]
【发布时间】:2015-06-12 04:30:30
【问题描述】:

我有一个 PHP 函数,里面有一个数组。我将数组放入其中,因此参数将是选项,这些将是默认值。示例

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

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

但是我一直收到错误

语法错误,意外'(',期待']'

所以我假设你在构造函数时不能传递这样的数组。有什么更好的方法来执行此操作或修复?

【问题讨论】:

  • 你的问题是函数调用!您不能使用“动态”数据设置默认参数
  • 是的^但是很好的想法
  • 我会使用依赖注入。传入apiKeyConfig 或类似类型的对象,其中apiKeyConfig 需要您提到的参数,然后输入提示参数必须是apiKeyConfig 的实例。

标签: php arrays function


【解决方案1】:

您只能将标量类型用于函数参数的默认值。

您也可以在手册中阅读:http://php.net/manual/en/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',
        ];    
    }
    //...
}

【讨论】:

  • 你会推荐这个而不是这个问题中的其他解决方案吗?
  • @kmgilbert100 在这两个答案中,您必须确保占位符是唯一的。我在这里看到的优势是您可以多次使用占位符,并且您不需要为每个占位符使用 if 语句。 (刚刚添加了另一个我认为可能是最好的解决方案的例子,因为如果你传递一个空数组,你不必检查)
  • 似乎是一个更好的解决方案,我喜欢它,谢谢!
  • 实际上只是想,虽然第二个选项不起作用,因为如果我只想传递用户 ID 而不是级别和忽略限制不会只传递一个通过摆脱默认级别和忽略限制值?
  • @kmgilbert100 所以你的意思是如果你传递一个包含 2 个元素的数组,它不会选择默认数组?
【解决方案2】:

这里的问题是:

Auth::id()

这调用了一个在这种情况下是非法的方法

我会这样解决:

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

【讨论】:

  • Ic,我需要这个函数在默认值范围内,最好只在函数内做一个数组合并并将$data默认设置为null?
【解决方案3】:

array_mearge 提供更通用的解决方案。这样您就可以重写任何参数,而无需单独检查每个参数。

function create($somthing, $settings = [])
{
    $default = [
        'date' => date("Y-m-d H:i:s"),
        'bold' => false,
        'italic' => false,
    ];
    $settings = array_merge($default, $settings);
    ...
}

【讨论】:

    猜你喜欢
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多