gpt4 book ai didi

php - 推导 PHP 闭包参数

转载 作者:可可西里 更新时间:2023-11-01 12:30:19 26 4
gpt4 key购买 nike

我是否有机会推断出 PHP Closure 参数类型信息?考虑这个例子:

<?php

$foo = function(array $args)
{
echo $args['a'] . ' ' . $args['b'];
};

$bar = function($a, $b)
{
echo $a . ' ' . $b;
};

$closure = /* some condition */ $foo : $bar;

if(/* $closure accepts array? */)
{
call_user_func($closure, ['a' => 5, 'b' => 10]);
}
else
{
call_user_func($closure, 5, 10);
}

?>

我想给用户留一些自由,这样他或她可以决定哪种方式更好地定义将在我的调度程序中注册的闭包——它是接受关联数组中的参数还是直接作为闭包参数。因此,dispatcher 需要推断传递的 Closure 的参数,以确定它应该以哪种方式调用此 Closure。有什么想法吗?

最佳答案

使用reflection ,如果您需要根据代码结构做出决定。在你的情况下 ReflectionFunctionReflectionParameter是你的 friend 。

<?php
header('Content-Type: text/plain; charset=utf-8');

$func = function($a, $b){ echo implode(' ', func_get_args()); };

$closure = $func;
$reflection = new ReflectionFunction($closure);
$arguments = $reflection->getParameters();

if($arguments && $arguments[0]->isArray()){
echo 'Giving array. Result: ';
call_user_func($closure, ['a' => 5, 'b' => 10]);
} else {
echo 'Giving individuals. Result: ';
call_user_func($closure, 5, 10);
}
?>

输出:

Giving individuals. Result: 5 10

更改定义以测试:

$func = function(array $a){ echo implode(' ', $a); };

输出:

Giving array. Result: 5 10

关于php - 推导 PHP 闭包参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19198804/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com