【问题标题】:PHP using 'use' in anonymous function throws exceptionPHP在匿名函数中使用'use'引发异常
【发布时间】:2014-12-15 14:23:36
【问题描述】:

我正在使用最新版本的 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——所以我不确定互联网上那位的作者是否正确。

任何人都可以对此有所了解吗?我可以使用其他方法吗?

【问题讨论】:

  • 如果一个函数有名字,它就不是匿名的
  • 真的。我忽略了这一点,谢谢
  • .. 这是解析错误,不是异常。
  • 是啊是啊...技术... ;)

标签: php anonymous-function


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    把名字去掉,应该没问题的。

    【讨论】:

    • 这不起作用,因为在您的示例中对 usort 的调用无法访问现在未命名的函数。 sortBy 被名称引用为第二个参数
    • 糟糕,忘记了.. 已修复
    【解决方案3】:

    你不能使用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;
    }
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2014-12-27
        • 1970-01-01
        • 2014-09-11
        • 2013-09-12
        • 1970-01-01
        • 2015-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多