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

问题描述 投票:0回答:1

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

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."

在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.

我希望在客户端代码中没有提供可调用时,callable返回false。

可能重复的PHP 7.1 Nullable Default Function Parameter不能为这种情况提供解决方案。

php php-7 php-5.4
1个回答
2
投票

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

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

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

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

如果要使用可选的可调参数,则必须使用NULL作为默认值,然后在函数内测试变量。两者都有可选参数而不测试参数的要求是不兼容的。

© www.soinside.com 2019 - 2024. All rights reserved.