【发布时间】:2015-11-14 11:09:23
【问题描述】:
我觉得这很有趣!!! :)。
我有什么?
在我在某些对象的某个级别上使用的应用程序中(并不重要),我得到一个数组,例如:
$array = array(
'argument_label' => 'value_label',
'argument_name' => 'value_name',
'argument_id' => 'value_id'
)
我对这个数组的创建方式和时间没有任何影响。接下来,我有一个方法:
public function arrayArgument($array) {
$label = isset($array['argument_label']) ? $array['argument_label'] : 'default_label';
$name = isset($array['argument_name']) ? $array['argument_name'] : 'default_name';
$id = isset($array['argument_id']) ? $array['argument_id'] : 'default_id';
// Do something
return 'something';
}
我真的很讨厌它。无法为方法参数提供适当的文档(因为 PHPDocumentator 对数组的工作不太好),这些问题让我发疯。此外,对于将来使用此代码的人来说,这是一场噩梦,那时我已经是一个“退休的书呆子”了。
我想要什么?
我想要一个这样的功能:
public function notArrayArgument(
$id='default_id',
$label='default_label',
$name='default_name'
) {
// Do something
return 'something';
}
我能做什么?
当我得到数组时,我可以更改一些代码,并让我自己的方法运行。所以我需要某种解决方案才能从这里获得:
$array = array(
'argument_label' => 'value_label',
'argument_name' => 'value_name',
'argument_id' => 'value_id'
)
到这里:
notArrayArgument('value_id', 'value_label', 'value_name');
或者这里:
notArrayArgument($array['argument_id'], $array['argument_label'], $array['argument_name']);
有什么问题?
- 这不像模板。变量的个数总是不同的,名字也总是不同的,有时传递一些,有时不传递。
- 它应该工作得非常快...
- 以正确的顺序调用方法参数。数组可以排序,不排序或随机排序,而方法内部的参数始终保持相同的顺序。应该重新排序数组以匹配方法参数的顺序,然后调用该方法。
我带来了什么?
-
我有一个使用 reflectionClass 的想法。我可以检查方法参数的名称,按顺序获取它们,重新排序数组并尝试调用此方法。但这是相当消耗资源的解决方案,因为我认为反射类并没有那么快。
-
使用提取的解决方案?这会很棒。但提取后,我需要在代码中使用确切的变量名称。而且我不知道它们每次都不一样,我需要一种通用的方法。
-
新(感谢评论):call_user_func_array()。这很好,但它只适用于索引数组,所以这将是可能解决方案的最后但并非最不重要的一步。由于参数的顺序仍然未知......
这个问题有很好的语义、实用的解决方案吗?
我再次阅读了我的问题,希望清楚明白。如果没有,请发表评论,我会尽力更好地描述问题。
【问题讨论】:
-
谢谢评论。是的,这是一个不错的函数,但是: param_arr:要传递给回调的参数,作为 INDEXED 数组。它只使用索引数组...没有 key=>value 数组,所以问题仍然存在,因为我不知道我应该添加参数的顺序。如果它可以与 key=>value 数组一起使用,我会为这个发现获得 200 个 stackoverflow 点;)。
标签: php arrays methods arguments