我正在制作将一些数据插入我的数据库的功能:
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>
,还是有更好的方法将大量可选变量传递给函数?
答案 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'特定的''的可能性: