我正在使用最新版本的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 - 所以我不确定互联网那一位的作者是否正确。
有人可以对此有所了解吗?我可以使用另一种方法吗?
答案 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)
将该功能移到另一个功能之外。嵌套函数真的很难读,尤其是在这个函数中使用名称的方式。它最有可能导致编译器问题。