PHP中类似Ruby的数组参数实现

我使用PHP编程,而有时我碰巧需要一种方法来将这些“哈希参数”实现到我的PHP函数中(比如说,一个HTML选择帮助器)

draw_select :name => :id, :onclick => 'alert(this.value)' 

PHP中的问题是我必须定义一个参数顺序来实现许多可能的属性。

我一直在考虑定义1个字符串参数并使用json_decode(),所以我可以传递这样的参数:

 draw_select("'name': 'id', 'onclick': 'alert(this.value)' ") 

定义如下:

 function draw_select($string) { // use json_decode here and pass them as variables } 

你知道一个更聪明的方法吗?或者你认为在PHP中使用它实际上是否真的有意义?

编辑添加:我正在寻找一种“替代”替代方案,只需将一个signle数组作为参数传递,如函数(array(…))

PHP肯定在这方面缺少一些糖。 我也做了很多Python,并且在使用PHP时我非常想念命名参数。 但是,使用PHP,每当我有一个需要接受多个选项的函数时,我只接受一个或两个必需/重要参数,并接受其余的数组:

 function draw_select($name, $options = array(), $html_options = array()) { } 

这就像CodeIgniter和CakePHP这样的库处理相同的场景的方式。

就个人而言,在PHP的关联数组如此强大的情况下,在这种情况下使用JSON并没有带来真正的好处。 只要坚持语言给你的东西,这就是用PHP做的方法。

为什么不通过数组呢?

 draw_select(array( 'name'=> 'id', 'onclick'=> 'alert(this.value)' )); 

在任何版本的PHP中都没有一种方法可以做到这一点,包括PHP 5.3。

PHP不支持命名参数和/或smalltalk / objective-c / ruby​​样式选择器。 PHP没有提供重新定义这部分语言的方法。 如果你想在PHP中使用它,那你就不走运了。 PHP从未成为所谓的“元编程”的最佳语言选择。

正如其他人所提到的,PHP的最佳选择是使用带有键/值对的数组和提取。

 myFunction(array( 'theThing'=>0, 'param2'=>'another value', )); function myFunction($params){ extract($params); echo $param2; } 
  1. 你可以在C / C ++上编写一个扩展来扩展PHP的这种能力,但你是一个受虐狂。 🙂

由于这里的所有选项都涉及调用array ,并且它似乎是“PHPish”的处理方式,所以如果你一直这样做,那么可能会有一个函数z() (我只是想在jQuery中使用$() )别名为array() 。 除了名称数组的长度,我不知道Ruby版本是如何更优雅的。 字符较少,但我有点不喜欢您不能立即区分该示例代码中的函数参数和键/值对之间的区别。

解决方案是使用变量参数。

我有时将其用于本身不支持关联数组的语言。

 function AssociativeArrayFromFlatArray($args) { $nbArgs = count($args); if( $nbArgs % 2 != 0 ) { die('This function must have an even number of arguments'); } $ret = array(); for( $i = 0; $i < $nbArgs; $i += 2 ) { $key = $args[$i]; $value = $args[$i + 1]; $ret[$key] = $value; } return $ret; } function DoSomething(/*...*/) { $args = AssociativeArrayFromFlatArray(func_get_args()); if( $args['action'] == 'greet' ) { $count = $args['count'] or 1; for( $i = 0; $i < $count; $i += 1 ) { echo $args['text']; } } } DoSomething('action', 'greet', 'count', 10, 'text', 'Hello World! '); 

虽然这对于PHP使用它是一种耻辱,因为它本身支持关联数组...

您可以使用’ func_get_args() ‘函数,只使用每个第一个参数作为var名称,每秒使用一个值作为值。 它可能与你要达到ruby的方式一样接近(我一直在寻找年龄的方式来做到这一点,我完全理解你对ruby优雅的数组解决方案的意思)。 希望在未来PHP打开它自己可以执行重新编程就像ruby一样(不知道实际上叫什么,但它是什么让ruby和ruby在轨道上如此辉煌)。