PHP使用';使用';在匿名函数中抛出异常


PHP using 'use' in anonymous function throws exception

我在一个类中使用最新版本的PHP,并编写一个排序函数,其中包括以下内容:

public static function sort_alphabetically($data, $sortBy=null)
{
    ...
    if($sortBy)
    {
        function sortBy($a, $b) use ($sortBy)
        {
            if ($a->$sortBy == $b->$sortBy){return 0;}
            if ($a->$sortBy > $b->$sortBy){return 1;}
            else{return -1;}
        };
        usort($data, "sortBy");
    }
    return $data;
}

但我一直在接受

分析错误:语法错误,意外的"use"(T_use),应为"{"…

很难在谷歌上搜索单词use并获得有用的结果,但我看到有人提到它不能在类或命名空间中使用。然而,PHP文档正是这样做的——http://php.net/manual/en/functions.anonymous.php-所以我不确定那篇互联网文章的作者是否正确。

有人能解释一下吗?我能用别的方法吗?

use关键字(不是唯一的用例)用于将变量导入闭包或匿名函数(其他用途是导入名称空间或特征)。

这不适用于有名称的传统函数(如您的情况)。您所做的只是将一个函数嵌套到另一个函数中。为了能够将变量导入闭包或匿名函数,您需要首先声明一个。

您有以下选项:

public static function sort_alphabetically($data, $sortBy=null)
{
    ...
    if($sortBy)
    {
        usort($data, function($a, $b) use ($sortBy){
            if ($a->$sortBy == $b->$sortBy){return 0;}
            if ($a->$sortBy > $b->$sortBy){return 1;}
            else{return -1;}        
        });
    }
    return $data;
}

在这里,您可以使用闭包并将$sortBy变量导入其中

public static function sort_alphabetically($data, $sortBy=null)
{
    ...
    if($sortBy)
    {
        $callback = function($a, $b) use ($sortBy){
            if ($a->$sortBy == $b->$sortBy){return 0;}
            if ($a->$sortBy > $b->$sortBy){return 1;}
            else{return -1;}        
        };
        usort($data, $callback);
    }
    return $data;
}

在这种情况下,使用了一个匿名函数。

use语言构造仅对匿名函数有效。你的函数不是匿名的,因为你给它起了一个名字。

public static function sort_alphabetically($data, $sortBy=null)
{
    ...
    if($sortBy)
    {
        $f = function($a, $b) use ($sortBy)
        {
            if ($a->$sortBy == $b->$sortBy){return 0;}
            if ($a->$sortBy > $b->$sortBy){return 1;}
            else{return -1;}
        };
        usort($data, $f);
    }
    return $data;
}

删除名称,你应该没事。

除非是匿名函数或闭包,否则不能使用use。假设您没有在其他地方重用该函数,您可以很容易地调整代码以适应,如下所示。类似地,您可以将函数分配给一个变量,并将该变量用作usort 的第二个参数

public static function sort_alphabetically($data, $sortBy=null)
{
    if($sortBy)
    {
        usort($data, function ($a, $b) use ($sortBy)
        {
            if ($a->{$sortBy} == $b->{$sortBy}){return 0;}
            if ($a->{$sortBy} > $b->{$sortBy}){return 1;}
            else{return -1;}
        });
    }
    return $data;
}

将函数移到其他函数之外。嵌套函数真的很难阅读,尤其是使用该函数中名称的方式。这很可能导致编译器问题。