PHP键=>;值数组到方法参数(顺序?)
我觉得这很有趣!!!:)强>PHP键=>;值数组到方法参数(顺序?),php,arrays,methods,arguments,Php,Arrays,Methods,Arguments,我觉得这很有趣!!!:) 我有什么? 在我在某种程度上对某些对象使用的应用程序中(其实并不重要),我得到了一个数组,例如: $array = array( 'argument_label' => 'value_label', 'argument_name' => 'value_name', 'argument_id' => 'value_id' ) 我对创建此阵列的方式和时间没有任何影响。接下来,我有一个方法: public function arr
我有什么? 在我在某种程度上对某些对象使用的应用程序中(其实并不重要),我得到了一个数组,例如:
$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在数组中工作得不太好),这些ISSET让我抓狂。此外,对于将来使用此代码的人来说,这是一场噩梦,因为我已经是一个“退休的书呆子”
我想要什么? 我想要一个这样的函数:
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']);
有什么问题?
我带来了什么?
我又读了一遍我的问题,我希望它能清楚地理解。如果没有,请发表评论,我会尽我所能更好地描述问题。考虑维护者是一件好事,但我认为简单性与良好的语义和实用性同样重要。想一想:如果你必须问如何写这样的模式,那么它对读者来说有多大的可能性?我更愿意在遇到代码时只想“是的,这很清楚”,而不是“哦,很酷,这是一种设置数组默认值的非常复杂和聪明的方法”
考虑到这一点,在我看来,数组正在更适合类的情况下使用。您有一个id、一个标签和一个名称,它肯定代表了一个实体——这正是类的用途!类可以轻松设置默认值,并为其每个属性提供PHPDoc。您可以有一个构造函数,它只接受一个现有数组,并使用一个默认数组对其进行排序。为了方便地进行反向转换,在PHP中将对象强制转换为数组会产生其属性的关联数组。考虑到维护者,这是值得称赞的,但我认为简单性与良好的语义和实用性同样重要。想一想:如果你必须问如何写这样的模式,那么它对读者来说有多大的可能性?我更愿意在遇到代码时只想“是的,这很清楚”,而不是“哦,很酷,这是一种设置数组默认值的非常复杂和聪明的方法”
考虑到这一点,在我看来,数组正在更适合类的情况下使用。您有一个id、一个标签和一个名称,它肯定代表了一个实体——这正是类的用途!类可以轻松设置默认值,并为其每个属性提供PHPDoc。您可以有一个构造函数,它只接受一个现有数组,并使用一个默认数组对其进行排序。为了方便地进行反向转换,在PHP中将对象强制转换为数组会产生其属性的关联数组。考虑到维护者,这是值得称赞的,但我认为简单性与良好的语义和实用性同样重要。想一想:如果你必须问如何写这样的模式,那么它对读者来说有多大的可能性?我更愿意在遇到代码时只想“是的,这很清楚”,而不是“哦,很酷,这是一种设置数组默认值的非常复杂和聪明的方法”
考虑到这一点,在我看来,数组正在更适合类的情况下使用。您有一个id、一个标签和一个名称,它肯定代表了一个实体——这正是类的用途!类可以轻松设置默认值,并为其每个属性提供PHPDoc。您可以有一个构造函数,它只接受一个现有数组,并使用一个默认数组对其进行排序。为了方便地进行反向转换,在PHP中将对象强制转换为数组会产生其属性的关联数组。考虑到维护者,这是值得称赞的,但我认为简单性与良好的语义和实用性同样重要。想一想:如果你必须问如何写这样的模式,那么它对读者来说有多大的可能性?我更愿意在遇到代码时只想“是的,这很清楚”,而不是“哦,很酷,这是一种设置数组默认值的非常复杂和聪明的方法” 考虑到这一点,在我看来,数组正在更适合类的情况下使用。您有一个id、一个标签和一个名称,它肯定代表了一个实体——这正是类的用途!
function arrayArgument($object, $method, $array)
{
$arguments = [];
$reflectionMethod = new ReflectionMethod(get_class($object), $method);
foreach ($reflectionMethod->getParameters() as $parameter)
{
$arguments[] = isset($array[$parameter->name]) ? $array[$parameter->name] : $parameter->getDefaultValue();
}
call_user_func_array(array($object, $method), $arguments);
}
$instance = new MyClass();
arrayArgument($instance, 'notArrayArgument', ['name' => 'myname']);