我有一个带有2个参数的函数:一个字符串和一个可调用的。 我希望可调用项是可选的。见下文。
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中,可以在函数参数中声明/类型hint一个可调用对象。函数主体中将不再需要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.
当客户端代码未提供可调用对象时,我希望可调用对象返回false。
可能的重复PHP 7.1 Nullable Default Function Parameter不能为这种情况提供解决方案。
答案 0 :(得分:2)
可调用的唯一可接受的默认参数是NULL
。这是部分记录的文档,但是没有明确或完整的记录(据我所知)。综合使用手册,您可以得出结论,不允许使用匿名函数。可调用提示参数的默认值也不允许使用其他有效的可调用类型,但这在手册中没有(据我所知)。
function arguments手册页指出,只有标量,数组和NULL
是默认参数。可调用对象可以是对象(Closure
或具有__invoke
方法的对象),2个元素数组(类或对象以及方法名称)或字符串。对象不是标量(如is_scalar
手册页所述),因此即使是未键入隐式参数也不能用作默认参数(排除匿名函数)。从手册开始,这似乎允许可调用参数使用字符串和数组默认值,但是如果您尝试使用字符串或数组,PHP会给出错误:
具有可调用类型的参数的默认值只能为NULL
尽管通常允许使用数组和字符串作为默认值,但是在编译时不能总是对它们进行类型检查以检查可调用对象;它们可能引用尚未定义的可调用对象,从而导致类型检查产生错误的否定值。我怀疑因此,它们被排除在可调用对象的默认值之外。
如果要具有可选的可调用参数,则必须使用NULL
作为默认值,然后在函数中测试变量。两者都具有可选参数且不测试该参数的要求是不兼容的。