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

时间:2014-10-20 14:44:18

标签: php anonymous-function

我正在使用最新版本的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;
}

但我一直在

  

解析错误:语法错误,意外'使用'(T_USE),期待'{'...

很难对单词use进行搜索并获得有用的结果,但我已经看到它不能在类或命名空间中使用。但是,PHP文档正是这样做的 - http://php.net/manual/en/functions.anonymous.php - 所以我不确定互联网那一位的作者是否正确。

有人可以对此有所了解吗?我可以使用另一种方法吗?

4 个答案:

答案 0 :(得分:3)

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;
}

在这种情况下,正在使用匿名函数。

答案 1 :(得分:0)

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;
}

删除名称,你应该没事。

答案 2 :(得分:0)

除非是匿名函数或闭包,否则不能使用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;
}

答案 3 :(得分:-1)

将该功能移到另一个功能之外。嵌套函数真的很难读,尤其是在这个函数中使用名称的方式。它最有可能导致编译器问题。