我注意到,如果我们希望运行某个回调函数,我可以使用ClosureCallable作为类型提示.例如:

function callFunc1(Closure $closure) {
    $closure();
}

function callFunc2(Callable $callback) {
    $callback();
}

$function = function() {
    echo 'Hello, World!';
};

callFunc1($function); // Hello, World!
callFunc2($function); // Hello, World!

问题:

这里有什么不同?换句话说,什么时候使用Closure,什么时候使用Callable,或者它们服务于相同的目的?

推荐答案

区别在于,Closure必须是匿名函数,而callable也可以是普通函数.

你可以通过下面的例子看到/测试这一点,你会看到第一个错误:

function callFunc1(Closure $closure) {
    $closure();
}

function callFunc2(Callable $callback) {
    $callback();
}

function xy() {
    echo 'Hello, World!';
}

callFunc1("xy"); // Catchable fatal error: Argument 1 passed to callFunc1() must be an instance of Closure, string given
callFunc2("xy"); // Hello, World!

因此,如果您只想输入提示匿名函数,请使用:Closure,如果您还想允许正常函数,请使用callable作为类型提示.

Php相关问答推荐

使用额外的输入字段自定义WooCommerce单个产品

基于验证动态更改输入字段类(名称密码)&

如何隐藏x轴图表上的值

如何将对我的域的请求重定向到子文件夹中的索引,同时保留域URL并使用.htaccess?

通过DO LAMP进行身份验证并从邮箱发送邮箱的最简单方式是什么

WooCommerce在购买后多次重定向

如何从该字符串中删除这些图标转换的ASCII问号字符?

限制某些产品只能在WooCommerce的特定邮政编码/邮政编码范围内发货

在WooCommerce上克隆订单时使用`add_product()`添加产品元数据

从两个日期创建日期范围,然后为范围中的每个日期复制子数组

拉威尔10有许多通过获取所有祖父母数据的子元素S图像

未定义的类型';PDF';在Laravel 8

防止 WooCommerce 在前端加载全尺寸图像

使用 PHP,我可以将 foreach 语句放入瞬态中吗?

WooCommerce 以编程方式添加的费用不会持续存在

批量更新 WooCommerce 中所有产品的特定自定义字段

如何在 Laravel 迁移中使用日期时间和天数?

来自 GoDaddy 的邮箱在 Gmail 中显示为via

PHP / DOM : 解析 HTML 以提取基于类的数​​据

如何使 Wordpress Woocommerce 自定义输入字段成为必填字段