【问题标题】:PHP Anonymous Function as Default Argument?PHP匿名函数作为默认参数?
【发布时间】:2012-10-01 15:39:31
【问题描述】:

有没有办法在php中做到这一点?

//in a class
public static function myFunc($x = function($arg) { return 42+$arg; }) {
   return $x(8); //return 50 if default func is passed in
}

【问题讨论】:

  • 我能问一下你为什么要这样做吗?
  • 好吧,我有一个通用的实用函数,它以匿名函数作为参数(具体来说,它根据某些规则将对象分类转换为数组分类,由函数执行)。我想要一个默认操作。那是过分的要求? =x
  • 没有。默认参数只能是常量值,不能是表达式,也不能是对象。

标签: php arguments anonymous-function


【解决方案1】:

PHP 默认函数参数只能是标量或数组类型:

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

From: PHP Manual / Function Arguments / Default argument values

怎么样:

public static function myFunc($x = null) {

    if (null === $x) {
        $x = function($arg) { return 42 + $arg; };
    }

    return $x(8); //return 50 if default func is passed in
}

【讨论】:

  • 答案被接受,因为指向 php 手册的链接说“默认值必须是常量表达式,而不是(例如)变量、类成员或函数调用。”谢谢。我之前有这样的东西,我希望有一个语言功能。猜不到 =(
  • 我还建议在函数签名中声明$x 的类型,因为当$x(8) 发生时传入字符串会导致错误。我个人会将类型声明为Closure 以确保它是一个匿名函数,但callable 也可以工作并且更加灵活(并且容易出错)。所以myFunc(Closure $x = null)myFunc(callable $x = null),如果您尝试myFunc("test");,任何一个都会抛出可捕获的致命错误,而如果未声明类型,则会抛出不可捕获的致命错误。
【解决方案2】:

您可以使用func_num_argsfunc_get_arg

//in a class 
public static function myFunc() { 
    if (func_num_args() >= 1) {
        $x = func_get_arg(0);
    } else {
        $x = function($arg) { return 42+$arg; }
    }
    return $x(8); //return 50 if default func is passed in 
} 

但我同意 tradyblix 的观点,即您可以像在

中那样处理数据
//in a class 
public static function myFunc() { 
    if (func_num_args() >= 1) {
        $x = func_get_arg(0);
        $retval = $x(8);
    } else {
        $retval = 42 + 8;
    }
    return $retval; //return 50 if default func is passed in 
} 

【讨论】:

  • 不知道 func_num_args 和 func_get_arg。非常 bash。
猜你喜欢
  • 2012-02-03
  • 2011-02-21
  • 1970-01-01
  • 2019-11-23
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 2018-08-16
  • 1970-01-01
相关资源
最近更新 更多