php 7 中函数定义中的默认可调用

Jul*_*ian 2 php php-5.4 php-7

我有一个带有两个参数的函数:一个字符串和一个可调用的。我希望可调用对象是可选的。见下文。

function saySomething($str, $callback){

    echo $str;

    $res = false;
    if(is_callable($callback)){
        $res = $callback();
    }

    if($res){
        echo ', I am cool';
    } else {
        echo ', I am not cool';
    }
}

// This works as I expect
saySomething('piet');// deliberately not supplying a callback
// I want the output to be: piet, I am not cool.
// The output in this case: "piet, I am not cool."
Run Code Online (Sandbox Code Playgroud)

在 php 5.4 和 php 7 中,可以在函数参数中声明/类型提示可调用。is_callable函数体中不再需要它们。接下来,如果这样做,那么可调用参数必须有效,因此它不再是可选的。

我想要什么?

我想知道是否可以使用可调用类型声明,但将其保留为可选参数。

我试过这个:

// This is not possible :-(
// Fatal error: Uncaught ArgumentCountError: Too few arguments to function saySomething()
function saySomething($str, callable $callback = function(){return false;}){

    echo $str;

    $res = $callback();
    if($res){
        echo ', I am cool';
    } else {
        echo ', I am not cool';
    }
}

saySomething('piet'); // deliberately not supplying a callback
// I want the output to be: piet, I am not cool.
Run Code Online (Sandbox Code Playgroud)

当客户端代码未提供可调用对象时,我希望可调用对象返回 false。

可能重复的PHP 7.1 可空默认函数参数没有为这种情况提供解决方案。

out*_*tis 6

可调用的唯一接受的默认参数是NULL。这是部分记录的,但既不明确也不完整记录(据我所知)。从手册综合来看,您可以得出结论:不允许使用匿名函数。其他有效的可调用类型也不允许作为可调用提示参数的默认值,但这不在手册中(据我所知)。

函数参数手册页指出,只有标量、数组和NULL可以作为默认参数。Callables 可以是对象(Closure或带有__invoke方法的对象)、2 元素数组(类或对象和方法名称)或字符串。对象不是标量(如is_scalar手册页所述),因此不能用作默认参数(这排除了匿名函数),即使对于无类型提示的参数也是如此。脱离手册,这似乎允许可调用参数使用字符串和数组默认值,但如果您尝试使用字符串或数组,PHP 会给出错误:

可调用类型参数的默认值只能为 NULL

虽然数组和字符串(通常)允许作为默认值,但它们并不总是在编译时对可调用对象进行类型检查;它们可能引用尚未定义的可调用对象,从而导致类型检查产生误报。我怀疑正因为如此,它们被排除在可调用对象的默认值之外。

如果您想要有一个可选的可调用参数,则必须将其用作NULL默认值,然后在函数内测试该变量。具有可选参数且不测试该参数的要求是不兼容的。

  • 我同意你的看法。**可选的可调用对象应将 NULL 作为默认值,并且不带类型声明**。顺便说一句,数组不是标量。`标量变量是包含整数、浮点数、字符串或布尔值的变量。类型数组、对象和资源不是标量。`。请参阅链接:https://www.php.net/manual/en/function.is-scalar.php (2认同)