【问题标题】:Named Arguments in PHPPHP 中的命名参数
【发布时间】:2011-07-23 12:34:42
【问题描述】:

在 C# 中,4.0 附带了一个名为 Named Arguments 的新功能,并且与 Optional Parameters 配合得很好。

private static void writeSomething(int a = 1, int b = 2){
   // do something here;
}

static void Main()
{
   writeSomething(b:3); // works pretty well 
}

我使用此选项从用户那里获取一些设置值。

在 PHP 中,除了可选参数外,我找不到任何类似的东西,但我接受 $.fn.extend (jQuery) 类型的函数:

function settings($options)
{
   $defaults = array("name"=>"something","lastname"=>"else");
   $settings = array_merge($defaults,$options);
}

settigs(array("lastname"=>"John");

我想知道您正在使用哪种解决方案,或者您会在相同情况下使用哪种解决方案。

【问题讨论】:

    标签: c# php asp.net


    【解决方案1】:

    如您所见,命名参数在 PHP 中不存在。


    但一种可能的解决方案是使用一个数组作为唯一参数——因为数组项可以命名:

    my_function(array(
        'my_param' => 10, 
        'other_param' => 'hello, world!', 
    ));
    


    而且,在您的函数中,您将从该唯一数组参数中读取数据:

    function my_function(array $params) {
    
        // test if $params['my_param'] is set ; and use it if it is
        // test if $params['other_param'] is set ; and use it if it is
        // test if $params['yet_another_param'] is set ; and use it if it is
        // ...
    
    }
    


    不过,这个想法有一个主要的不便之处:查看函数的定义,人们将不知道它期望/可以传递什么参数。

    他们每次想要调用您的函数时都必须阅读文档——这不是人们喜欢做的事情,是吗?

    附加说明:IDE 也无法提供提示;而且phpdoc也会被破坏...

    【讨论】:

    • Eclipse 可以与用户定义的 PHPdoc 一起正常工作。他们可能需要检查他们需要发送哪些参数,但至少他们不必遵循命令,也不需要传递所有内容,但我知道它不像 C# 完成同样事情的方式那么优雅。
    • Eclipse 会建议您可以为数组的键使用哪些名称?
    • 否,但您可以在文档描述中写下接受哪些键,这样一旦用户将鼠标移到function,他/她就会看到弹出的文档。由于它是动态结构,IDE 很难完全提供自动完成功能,但 Eclipse 在这方面做得很好。
    • 是的,我就是这么想的;不是一个很好的解决方案:-(
    【解决方案2】:

    您可以通过使用$array= array('arg1'=>'value1'); 之类的数组来解决此问题 然后让函数接受function dostuff($stuff);等数组 然后,您可以在函数内部使用if(isset($stuff['arg1')){//do something.} 检查参数

    这只是一种变通方法,但也许会有所帮助

    【讨论】:

    • 默认值怎么样。我喜欢对未分配的变量使用默认值。
    • 使用数组提供数据时,您可以完全控制如何使用数组。
    • 要有默认值,想法在函数里,使用if(isset($stuff['arg1')){ //do something, a value is set } else { //do something, a value isn't set. Use a default value here }
    【解决方案3】:

    您可以通过检查设置变量来伪造 C++ 样式的可选参数(即所有可选参数都在末尾):

    function foo($a, $b)
    {
      $x = isset($a) ? $a : 3;
      $y = isset($b) ? $b : 4;
      print("X = $x, Y = $y\n");
    }
    
    @foo(8);
    @foo();
    

    它会触发一个警告,我用@ 来抑制它。不是最优雅的解决方案,但在语法上接近您想要的。


    编辑。这是一个愚蠢的想法。改用可变参数:

    // faking foo($x = 3, $y = 3)
    function foo()
    {
      $args = func_get_args();
      $x = isset($args[0]) ? $args[0] : 3;
      $y = isset($args[1]) ? $args[1] : 3;
      print("X = $x, Y = $y\n");
    }
    
    foo(12,14);
    foo(8);
    foo();
    

    【讨论】:

    • 这里的位置仍然很重要。如果不传递 $a 的值,我无法将值传递给 $b。如果我误解了,请纠正。
    • 是的,您不能在之前以这种方式有一个省略的参数。
    • 但这是一种非常模糊的技术。过于信任函数消费者?
    • 嗯...正确记录您的函数!或者使用其他人建议的更详细的基于数组的参数,这将允许您处理特定错误。
    猜你喜欢
    • 2011-06-17
    • 2021-06-04
    • 1970-01-01
    • 2018-09-14
    • 2019-10-18
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多