使用关联数组作为php函数';s输入
偶尔我会用一个输入编写一个PHP函数,一个包含该函数所有输入的关联数组。这有一些好处,比如不必记住输入的正确顺序,但我也注意到它使实现对大型代码库的更改变得更加容易;当我需要添加另一个变量,并且该变量必须通过4或5个预先存在的函数时,如果我可以将它粘贴到数组中并传递它,那么就容易多了 我的问题是,这样做是否有负面影响 我很少在示例中或在我使用的开放源码中看到这样编写的函数,这让我相信这可能有缺点。如果没有理由不这样做,那么为什么不以这种方式编写所有函数呢 更新 谢谢你的回答。看起来有两个主要问题很突出: 代码可读性-无法判断哪些变量进入函数以及它们的用途 可变蠕变-可能导致大量阵列从一个函数反弹到下一个函数;不应将参数传递给不需要它们的函数 这两点都是我没有想到的使用关联数组作为php函数';s输入,php,arrays,object,function,Php,Arrays,Object,Function,偶尔我会用一个输入编写一个PHP函数,一个包含该函数所有输入的关联数组。这有一些好处,比如不必记住输入的正确顺序,但我也注意到它使实现对大型代码库的更改变得更加容易;当我需要添加另一个变量,并且该变量必须通过4或5个预先存在的函数时,如果我可以将它粘贴到数组中并传递它,那么就容易多了 我的问题是,这样做是否有负面影响 我很少在示例中或在我使用的开放源码中看到这样编写的函数,这让我相信这可能有缺点。如果没有理由不这样做,那么为什么不以这种方式编写所有函数呢 更新 谢谢你的回答。看起来有两个主要问题
一般的要点似乎是,如果代码存在问题,则可能应该将其转换为类。不幸的是,在这个特定的项目中,这样的重构超出了范围,但我也认为Bill Karwin的解决方案是好的——传递一系列可选变量。缺点是,任何查看代码的人(除您之外)都不知道方法中包含了哪些参数,这些参数来自何处,或者它们的用途。他们也不知道如何调用方法,因为如果不查看“参数数组”中所需的代码,就不清楚该方法。列出每个参数可以提高代码的可读性。传递单个关联数组不一定能解释传递给函数的数据类型。如果我拿起你的函数,看到它只是开始引用单个函数参数中的散列值,我会有点困惑。使用@param在docblock中显式地声明变量并提供一些文档非常有帮助。与可读性列表参数相比,必须在两个位置添加一个参数的成本很小。可能的缺点之一是最终会得到太多的参数。 这导致了代码可能会失去可读性的问题 在一种严格的面向对象方法中,您可以将所有这些“通过”多个函数调用传递的参数转换为持有这些方法的类的实例变量
永远不要将参数传递给它们实际不需要的函数。这里最大的代码味道是,添加另一个变量会级联4-5个不同的函数。我真的想不出这样做的理由
听起来您需要将此代码重构为一个类,这样您就可以一次性将值传递到构造函数中,并将其保存为成员变量。如果单独命名和传递参数,则生成文档会容易得多。您可能会认为使用数组可以更容易地添加新代码,但这样做的好处并不影响可读性。另外,离开你的代码2个月后再回来……弄清楚在什么情况下向数组中添加参数的顺序会成为一个非常头痛的问题。这不一定是个坏主意,因为PHP缺少许多其他现代编程语言(Python、Ruby等)中的“关键字参数”功能。但是,它肯定存在一些问题:
$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!