Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP键=>;值数组到方法参数(顺序?)_Php_Arrays_Methods_Arguments - Fatal编程技术网

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']);

有什么问题?

  • 这与模板不同。变量的数量总是不同的,名称总是不同的,有时传递一些变量,有时不传递
  • 它应该工作得很快
  • 以正确的顺序调用方法参数。数组可以排序,而不是排序或随机排序,而方法中的参数总是以相同的顺序排列。数组应该重新排序以匹配方法参数顺序,然后调用方法

  • 我带来了什么?

  • 我有一个使用reflectionClass的想法。我可以检查方法参数的名称,对它们进行排序,对数组重新排序,并尝试调用此方法。但这是一个消耗资源的解决方案,因为我认为reflectionClass并没有这么快

  • 使用提取液的溶液?这太好了。但在提取之后,我需要在代码中使用精确的变量名。我并不了解他们,因为每次他们都不一样,我需要一个通用的方法

  • 新建(thx注释):调用\用户\函数\数组()。这很好,但它只适用于索引数组,因此这将是可能的解决方案的最后一步,但并非最不重要的一步。由于争论的顺序仍然未知

  • 这个问题有一个很好的语义、实用的解决方案吗?


    我又读了一遍我的问题,我希望它能清楚地理解。如果没有,请发表评论,我会尽我所能更好地描述问题。

    考虑维护者是一件好事,但我认为简单性与良好的语义和实用性同样重要。想一想:如果你必须问如何写这样的模式,那么它对读者来说有多大的可能性?我更愿意在遇到代码时只想“是的,这很清楚”,而不是“哦,很酷,这是一种设置数组默认值的非常复杂和聪明的方法”


    考虑到这一点,在我看来,数组正在更适合类的情况下使用。您有一个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']);