Closure::fromCallable 用于导入函数
Closure::fromCallable for imported function
我正在玩 PHP 和一些函数式编程。
我使用的是 Functional-PHP library 但问题是 PHP 的通用问题(我使用的是 7.2)。
我尝试从导入的函数创建一个可调用函数,但我得到的是
TypeError:无法从可调用函数创建闭包:函数 'pick' 未找到或函数名称无效
示例代码:
use function Functional\pick;
class A
{
public function execute()
{
$pick1 = \Closure::fromCallable('pick');
}
}
PHP use
语句定义文件其余部分的别名,但它们不会影响引用导入函数的字符串或 class.
当你说
use function Functional\pick;
这意味着在该文件中,您只需使用 pick(...)
即可调用 Functional\pick
函数。但是,如果您使用字符串来引用它,那么 PHP 不知道扩展别名。
解决此问题的最快方法是在调用 fromCallable
时使用完全限定的函数名称:
$pick1 = \Closure::fromCallable('Functional\pick');
echo get_class($pick1);
Closure
或者,如果你真的想使用别名,你可以用另一个匿名函数将调用包装得更深:
use function Functional\pick;
$pick1 = \Closure::fromCallable(function (...$args) { return pick(...$args); });
但这更混乱,至少在我看来是这样。
编辑: php-externals
中的 this recent thread 对此进行了一些不错的讨论
我正在玩 PHP 和一些函数式编程。
我使用的是 Functional-PHP library 但问题是 PHP 的通用问题(我使用的是 7.2)。
我尝试从导入的函数创建一个可调用函数,但我得到的是
TypeError:无法从可调用函数创建闭包:函数 'pick' 未找到或函数名称无效
示例代码:
use function Functional\pick;
class A
{
public function execute()
{
$pick1 = \Closure::fromCallable('pick');
}
}
PHP use
语句定义文件其余部分的别名,但它们不会影响引用导入函数的字符串或 class.
当你说
use function Functional\pick;
这意味着在该文件中,您只需使用 pick(...)
即可调用 Functional\pick
函数。但是,如果您使用字符串来引用它,那么 PHP 不知道扩展别名。
解决此问题的最快方法是在调用 fromCallable
时使用完全限定的函数名称:
$pick1 = \Closure::fromCallable('Functional\pick');
echo get_class($pick1);
Closure
或者,如果你真的想使用别名,你可以用另一个匿名函数将调用包装得更深:
use function Functional\pick;
$pick1 = \Closure::fromCallable(function (...$args) { return pick(...$args); });
但这更混乱,至少在我看来是这样。
编辑: php-externals
中的 this recent thread 对此进行了一些不错的讨论