1

我主要用 PHP 和 Ruby 编程,有时我碰巧需要一种方法来将这些“散列参数”实现到我的 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 中尝试这样做实际上有任何意义吗?

编辑添加:我正在寻找一种“替代”替代方案,以仅将信号数组作为参数传递,例如 function(array(...))

4

6 回答 6

5

为什么不传递一个数组呢?

draw_select(array(
  'name'=> 'id', 
  'onclick'=> 'alert(this.value)'
));
于 2009-05-15T19:47:42.857 回答
3

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

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

}

这就是 CodeIgniter 和 CakePHP 等库处理相同<select>场景的方式。

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

于 2009-05-15T19:47:40.223 回答
1

在PHP 5.3 之前(包括 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,但您将成为一个受虐狂。:)
于 2009-05-16T01:02:47.110 回答
0

由于这里的所有选项都涉及调用array,而且它似乎是“PHPish”的做事方式,如果你一直这样做,我会说,也许拥有一个函数是有意义的z()(我是只是按照$()jQuery 中的思路思考)别名为array(). 除了名称数组的长度之外,我看不出 Ruby 版本有多优雅。字符较少,但我有点不喜欢在该示例代码中您无法立即区分函数参数和键/值对之间的区别。

于 2009-05-15T19:58:13.193 回答
0

一种解决方案是使用可变参数。

我有时将它与本机不支持关联数组的语言一起使用。

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 是一种耻辱,因为它本机支持关联数组...

于 2009-05-15T20:13:26.383 回答
0

您可以使用 ' func_get_args()' 函数,只需将每个第一个参数用作 var 名称,将每秒用作值。它可能与您接近 ruby​​ 方式一样接近(我一直在寻找一种方法来实现它,我完全理解您对 ruby​​ 对数组的优雅解决方案的意思)。希望将来 PHP 可以像 ruby​​ 一样在执行时打开它的自我重新编程(不知道实际叫什么,但正是它使 ruby​​ 和 ruby​​ on rails 如此出色)。

于 2009-07-18T03:26:03.237 回答