Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.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
C# PHP中的命名参数_C#_Php_Asp.net - Fatal编程技术网

C# PHP中的命名参数

C# PHP中的命名参数,c#,php,asp.net,C#,Php,Asp.net,在C#中,4.0提供了一个新特性,称为命名参数,可以很好地处理可选参数 private static void writeSomething(int a = 1, int b = 2){ // do something here; } static void Main() { writeSomething(b:3); // works pretty well } 我使用此选项从用户处获取一些设置值 在PHP中,除了可选参数之外,我找不到任何类似的东西,但我接受执行$.fn.ex

在C#中,4.0提供了一个新特性,称为命名参数,可以很好地处理可选参数

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");

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

正如您所发现的,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也将被破坏…

正如您所发现的,命名参数在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也将被破坏…

您可以通过使用一个数组来解决这个问题,比如
$array=array('arg1'=>'value1')
然后让函数接受数组,比如
函数dostuff($stuff)
然后,可以在函数本身内部使用
if(isset($stuff['arg1')){//do something.}
检查参数


这只是一个解决办法,但可能会有所帮助。

您可以使用一个数组,例如
$array=array('arg1'=>'value1');
然后让函数接受数组,如
函数dostuff($stuff);
然后,可以在函数本身内部使用
if(isset($stuff['arg1')){//do something.}
检查参数


这只是一个解决办法,但可能会有所帮助。

您可以通过检查集合变量来伪造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();

通过检查集合变量,可以伪造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
。如果我误解了,请更正。没错,在显式参数之前不能有一个省略的参数。但这是一种非常模糊的技术。过于信任函数使用者?嗯……正确地记录函数!a或者使用其他人建议的更详细的基于数组的参数,这将允许您处理特定错误。仍然在此处定位问题。如果不为
$a
传递值,我就无法将值传递给
$b
。如果我误解了,请更正。没错,在此显式参数之前不能有省略的参数方法。但这是一种非常模糊的技术。过于信任函数使用者?嗯……正确地记录函数!或者使用其他人建议的更详细的基于数组的参数,这将允许您处理特定错误。默认值呢。我喜欢对未赋值的变量使用默认值。Wh在使用数组提供数据时,您完全可以控制如何使用数组。要获得默认值,其思想是在函数中使用
if(isset($stuff['arg1')){//do something,设置了值}否则{//do something,未设置值。在此处使用默认值}
默认值呢。我喜欢对未分配的变量使用默认值。当使用数组提供数据时,您完全可以控制如何使用数组。要使用默认值,思想是在函数中使用
if(isset($stuff['arg1')){//do something,value set}else{//执行某些操作,未设置值。请在此处使用默认值}
Eclipse在PHPdoc用户定义的情况下运行良好。他们可能需要检查需要发送哪些参数,但至少他们不必遵循命令,也不需要传递所有信息,但我知道这并不像C#完成相同任务的方式那样优雅。Eclipse将建议您可以为数组的键使用哪些名称?没有t你可以把它写在文档描述上,哪些键可以接受,所以一旦用户将鼠标移动到
函数上,他/她就会看到文档弹出。由于它是动态结构,IDEs很难提供完全自动完成功能,但Eclipse做这件事很好。是的,这是我的想法;不是一个很好的解决方案:-(Eclipse在PHPdoc用户定义的情况下工作得很好。他们可能需要检查需要发送哪些参数,但至少他们不需要遵循命令,也不需要传递所有信息,但我知道这并不像C#完成相同任务的方式那样优雅。Eclipse将建议使用哪种方式。)