Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP使用';使用';在匿名函数中引发异常_Php_Anonymous Function - Fatal编程技术网

PHP使用';使用';在匿名函数中引发异常

PHP使用';使用';在匿名函数中引发异常,php,anonymous-function,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;

我正在一个类中使用最新版本的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),应为“{”

用谷歌搜索
这个词并获得有用的结果是很困难的,但我看到有人提到它不能在类或名称空间中使用。然而,PHP文档确实做到了这一点——因此我不确定这段互联网的作者是否正确


有人能解释一下吗?我可以使用其他方法吗?

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

使用
语言构造对仅匿名函数。您的函数不是匿名的,因为您给了它一个名称

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

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

在本例中,使用的是匿名函数。

如果函数有名称,则不是匿名True。我忽略了这一点,谢谢..这是一个解析错误,不是一个例外。是的,是的…技术细节…;)可能的重复将不起作用,因为在您的示例中对
usort
的调用无法访问现在未命名的函数
sortBy
被name引用为第二个参数woops,忘了这一点..修复