Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.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函数';s输入_Php_Arrays_Object_Function - Fatal编程技术网

使用关联数组作为php函数';s输入

使用关联数组作为php函数';s输入,php,arrays,object,function,Php,Arrays,Object,Function,偶尔我会用一个输入编写一个PHP函数,一个包含该函数所有输入的关联数组。这有一些好处,比如不必记住输入的正确顺序,但我也注意到它使实现对大型代码库的更改变得更加容易;当我需要添加另一个变量,并且该变量必须通过4或5个预先存在的函数时,如果我可以将它粘贴到数组中并传递它,那么就容易多了 我的问题是,这样做是否有负面影响 我很少在示例中或在我使用的开放源码中看到这样编写的函数,这让我相信这可能有缺点。如果没有理由不这样做,那么为什么不以这种方式编写所有函数呢 更新 谢谢你的回答。看起来有两个主要问题

偶尔我会用一个输入编写一个PHP函数,一个包含该函数所有输入的关联数组。这有一些好处,比如不必记住输入的正确顺序,但我也注意到它使实现对大型代码库的更改变得更加容易;当我需要添加另一个变量,并且该变量必须通过4或5个预先存在的函数时,如果我可以将它粘贴到数组中并传递它,那么就容易多了

我的问题是,这样做是否有负面影响

我很少在示例中或在我使用的开放源码中看到这样编写的函数,这让我相信这可能有缺点。如果没有理由不这样做,那么为什么不以这种方式编写所有函数呢

更新

谢谢你的回答。看起来有两个主要问题很突出:

代码可读性-无法判断哪些变量进入函数以及它们的用途

可变蠕变-可能导致大量阵列从一个函数反弹到下一个函数;不应将参数传递给不需要它们的函数

这两点都是我没有想到的


一般的要点似乎是,如果代码存在问题,则可能应该将其转换为类。不幸的是,在这个特定的项目中,这样的重构超出了范围,但我也认为Bill Karwin的解决方案是好的——传递一系列可选变量。缺点是,任何查看代码的人(除您之外)都不知道方法中包含了哪些参数,这些参数来自何处,或者它们的用途。他们也不知道如何调用方法,因为如果不查看“参数数组”中所需的代码,就不清楚该方法。列出每个参数可以提高代码的可读性。传递单个关联数组不一定能解释传递给函数的数据类型。

如果我拿起你的函数,看到它只是开始引用单个函数参数中的散列值,我会有点困惑。使用@param在docblock中显式地声明变量并提供一些文档非常有帮助。与可读性列表参数相比,必须在两个位置添加一个参数的成本很小。

可能的缺点之一是最终会得到太多的参数。 这导致了代码可能会失去可读性的问题

在一种严格的面向对象方法中,您可以将所有这些“通过”多个函数调用传递的参数转换为持有这些方法的类的实例变量


永远不要将参数传递给它们实际不需要的函数。

这里最大的代码味道是,添加另一个变量会级联4-5个不同的函数。我真的想不出这样做的理由


听起来您需要将此代码重构为一个类,这样您就可以一次性将值传递到构造函数中,并将其保存为成员变量。

如果单独命名和传递参数,则生成文档会容易得多。您可能会认为使用数组可以更容易地添加新代码,但这样做的好处并不影响可读性。另外,离开你的代码2个月后再回来……弄清楚在什么情况下向数组中添加参数的顺序会成为一个非常头痛的问题。

这不一定是个坏主意,因为PHP缺少许多其他现代编程语言(Python、Ruby等)中的“关键字参数”功能。但是,它肯定存在一些问题:

  • 如果您更改函数接受的参数,那么很可能必须更改调用它的代码,以匹配新参数

  • 如果您广泛使用这些数组,并且在许多函数调用中使用数组并简单地“传递”,这可能是一个迹象,表明您应该考虑将其中一些参数转换为结构化类

  • 如果将这些数组用作可变数据结构,则不一定知道调用函数后拥有的数组与传入的数组相同。这很可能会在某个时候回来帮助你

  • 为什么不这样写所有函数呢

    对于这一点,为什么不完全忘记参数,使用全局变量处理所有事情呢?(开玩笑)

    传递关联数组有一个有用的优点:可以选择多个函数参数,并且可以传递第N个参数的值,而不必传递第N-1个参数的值

    但如果不传递,就无法生成带有编译时错误的强制参数。也不能声明类型检查

    您必须在被调用函数中编写代码,以检查所需参数的存在和类型

    我使用的另一种方法是为那些必需的参数声明常规参数,然后作为最后一个(可选)参数,声明一个名为
    $options
    的关联数组,该数组只包含可选项

    function database_connect($dbname, $user, $password, array $options = array())
    

    在某些情况下,我觉得这是有道理的,但通常你可以通过创建多个行为稍有不同的方法来简化事情。然后,该方法的名称将明确它的用途

    通常,如果函数的参数大于3,则无论如何都将无法读取


    另一种方法是,经常使用的模式是将函数的单个参数设置为(已分类的)对象。“parameter类”将精确定义支持的内容。

    如果有人仍在搜索解决方案,请参见(示例函数为_construct())
    <?php
     function city($input){
       $i=count($input['iran']);
       $result="";
         for($b=1;$b<=$i;$b++){
           $result.='<div style="background:gold">'.$input['iran'][$b].'</div>';
           }
          return $result;
        }
    $cityName['iran'][1]="Tehran";
    $cityName['iran'][2]="Qom";
    $cityName['iran'][3]="MashHad";
    $cityName['iran'][4]="Isfahan";
    $cityName['iran'][5]="Shiraz";
    $cityName['iran'][6]="Yazd";
    
    echo city($cityName);
    ?>
    
    // default values fx.
    function param_default( $def = array(), $parameters= array() ){
        $parm_diff = array();
        $ak=array();
        $va=array();
        $parm = array();
        foreach($def as $key=>$values) if(!in_array($key, array_keys($parameters))){
            $ak[]=$key;
            $va[]=$values;
        }
        $parm_diff = array_combine($ak,$va);
        $parm = array_merge($parm_diff,$parameters);
        unset($parm_diff, $ak,$va);
    
        return $parm;
    }
    
    <?php
    // sample use 
     function my_func( $parameters = array() ){
        $def = array(
            'first' => 1,
            'second' => 'foo',
            'third' => -1
         );
       $parm = param_default( $def, $parameters );
       //hereon I can use my array
    
       var_dump($param);
    
       if ($param['second'] !=='foo'){
           echo 'Not foo!!';
           // whatever...
       }
    
       return true;
    }
    ?>
    
     // calling my_fun()
    
    $example = my_func( array('second'=>'bar') );
    
    // results in 
    $param array: 
    'first' => 1,
    'second' => 'bar',
    'third' => -1
    
    function testing($argumentos) {
        $var_1 = $argumentos['var_01'];
        $var_2 = $argumentos['var_02'];
    
        echo $var_1 . " " . $var_2;
    } 
    
    testing(array('var_01' => "mierda", 'var_02' => "conio!"));
    
     mierda conio!