[英]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;
}
但我一直都在
解析錯誤:語法錯誤,意外的“使用”(T_USE),期望為“ {” ...
用谷歌搜索“ use
”一詞並獲得有用的結果很困難,但是我看到有人提到它不能在類或命名空間中使用。 但是,PHP文檔確實做到了這一點-http: //php.net/manual/zh/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;
}
將功能移至其他功能之外。 嵌套函數確實很難閱讀,尤其是在此函數中使用名稱的方式。 這很可能導致編譯器問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.