使用数组作为函数参数,并将其作为变量提取

时间:2018-01-08 14:16:11

标签: php

我正在制作将一些数据插入我的数据库的功能:

extract()

...并且想通了我需要将大多数参数设置为可选:

function updateInfo($vars){
    extract($vars);
}

..直到我弄清楚参数列表变得太长了。所以我发现extract()并使我的参数列表成为一个选项数组:

<script type="text/javascript" src="//maps.google.com/maps/api/js?key=YOUR_KEY_HERE"></script>

您会以这种方式使用<script type="text/javascript" src="path/to/gmaps.js"></script>,还是有更好的方法将大量可选变量传递给函数?

4 个答案:

答案 0 :(得分:1)

我发现使用 extract()太神奇了,因为我们不知道变量来自哪里,因为它们没有在任何地方定义。

您必须考虑使用数组:

$array['key'];

$key = $array['key'];

这并不是那么糟糕,对于每个会阅读您代码的人来说,非常清楚

我可以使用数组而不是很多参数,其中一些是可选项。 Wordpress正在这样工作。

例如,它有一个函数,允许您获取带有一些参数的帖子:

$args = array(
    'post_type' => 'page',
    'posts_per_page' => 'status
);

$pages = get_posts($args);

还有很多其他论据是简化使用该功能的选项。

您可以考虑在函数中添加$default array()所有默认参数,将其与参数中给出的数组合并。

请参阅此主题作为参考: What is so wrong with extract()?

答案 1 :(得分:1)

如果你真的需要使用一个数组因为可以修改的字段太大,那么我建议你重构你的代码以固有地使用数组。下面是一个构建SQL查询以及修改内部状态数组的示例(是的,这是一个人为的例子):

<?php

function updateInfo($fields) {
        static $state = [
                'company' => 'oldCompany',
                'address' => 'oldAddress'
        ];
        $setList = [];
        foreach ($fields as $key => $value) {
                echo("Changing field " . $key . " from " . $state[$key] . " to " . $value . "\n");
                $state[$key] = $value;
                array_push($setList, $key . " = \"" . $value . "\""); // TODO escape SQL properly
        }
        $sql = "UPDATE myTable SET " . join(", ", $setList) . " WHERE myRowId = 123456";
        echo($sql . "\n");
}

updateInfo([
        'company' => 'newCompany',
        'address' => 'newAddress'
]);

?>

您可以通过将上述代码保存到example.php文件等文件并在控制台中运行php example.php来测试上述代码。

注意:您可以不是盲目接受输入数组中的键,而是可以使用foreach循环内部的switch语句检查键,并为每个键类型提供更高级的专用逻辑。

答案 2 :(得分:0)

您还可以遍历关联的数组,并根据键分配变量:

$values = array(
    'foo'=>'John',
    'bar'=>'Smith'
);

foreach($values as $variable=>$value){
    $$variable = $value;
}

echo $foo;
echo $bar;
// echos JohnSmith

答案 3 :(得分:0)

经过很多好的建议,我发现实际上使用数组可能是有益的。所以我在考虑这个:

updateInfo($vars) { 
    foreach($vars as $key->value) {
        switch ($key) {
            case 'phonenumber':
                ...
                break;
            case 'etc':
                ...
                break;
            default:
                ...
         }
     }
}

它给我留下了无限的论据,即使不知道它们(default:)以及特定于'case'特定的''的可能性: