在php中是否可以将函数调用作为参数默认值?

在php中是否可以将函数调用作为参数默认值?,php,Php,在php中,可以执行以下操作: function foo( $var = "bar" ){ echo $var; } foo(); // output : bar foo("cheese"); // output : cheese 我尝试过使用这样的函数: function foo( $var = get_defined_vars() ){} 返回了一个分析错误: Parse error: syntax error, unexpected '(', expecti

在php中,可以执行以下操作:

function foo( $var = "bar" ){
    echo $var;
}

foo();         // output : bar

foo("cheese"); // output : cheese
我尝试过使用这样的函数:

function foo( $var = get_defined_vars() ){}
返回了一个分析错误:

Parse error: syntax error, unexpected '(', expecting ')'
显而易见的答案是这样传递变量

function foo( $var ){
    // do stuff
}

foo( get_defined_vars() );
但是,该函数是可重载的,可以处理许多参数

我通常使用如下函数:

foo( $var1, $var2, $var3 ... etc );
但是,我需要
foo
函数上方作用域中定义的变量,这意味着每次使用
foo
函数时,我都必须通过
get\u defined\u vars()

每次我想使用这个函数时,我都必须调用
get_defined_vars(),这让我感到非常恼火像这样:

foo( get_defined_vars(), $var1, $var2, $var3 ... etc );
那么,有谁能想出一个办法来解决这个问题吗

我试过这个,也没用:

function foo(){
    $args = func_get_args();
    array_unshift( get_defined_vars() );
    call_user_func_array( "bar", $args );
}

function bar(){
    // do stuff
}

不,你不能。与属性类似,只允许使用静态值和数组。即使这样,我也不推荐它,因为它使函数调用变得不可预测

默认值必须是常量表达式,而不是(例如)变量、类成员或函数调用


试着做以下几点:

function foo( $var1, $var2, $varForDefinedVars=null ){
  if (is_null($varForDefinedVars)){
     $varForDefinedVars = get_defined_vars();
  }
}

对我来说,这听起来像是你在试图做一些肮脏的事情。我确信有更好的解决方案……如果函数需要父范围中所有定义的变量,唯一的方法就是将它们作为参数传入。除非“此范围之上的范围”是全局范围,否则无法从“此范围之上的范围”获取变量。但是我不得不说,拥有一个依赖于父作用域(或者实际上,任何不是当前作用域的作用域)中按名称定义的变量的函数对我来说听起来像是糟糕的设计。考虑构造并传递一个严格定义的对象,原因是用变量名调试变量,可能应该在某个地方提到它!
func\u get\u args()
get\u defined\u vars()
等提供的功能,它们可以神奇地看到特定于调用它们的作用域的数据,但不能作为用户定义的函数实现。这是一件好事——如果是这样的话,你会看到一些可怕的代码,甚至比你现在看到的还要糟糕。但是,如果您正在调试东西,您可能需要传递主题-例如,
print\r()
无法神奇地知道您希望它显示什么,您必须向它传递一个值。@AlexMorley Finch听说过XDebug吗?真的:看看它。这只会检索局部函数范围内的变量,而这似乎不是OP想要实现的。