簡體   English   中英

PHP在匿名函數中使用'use'引發異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM