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