2014-10-20 60 views
1

我在PHP的最新版本,一類中,寫一個排序的功能,其中包括以下內容: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; 
} 

但我始終越來越

Parse error: syntax error, unexpected 'use' (T_USE), expecting '{'...

這是很難谷歌的詞use和獲取有用的結果,但我已經看到了它不能在一個類或命名空間中使用一提。但是,PHP文檔的確如此 - http://php.net/manual/en/functions.anonymous.php - 所以我不確定互聯網那位作者是否正確。

任何人都可以對此有所瞭解嗎?有沒有其他方法可以使用?謝謝!

+6

如果一個函數有一個名字,它不是匿名的 – 2014-10-20 14:45:49

+0

爲真。我忽略了這一點,謝謝 – BIU 2014-10-20 15:03:08

+0

..這是一個解析錯誤,不是一個例外。 – 2014-10-20 15:03:31

回答

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

在這裏,你會利用一個封閉的和進口​​$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; 
} 

刪除名稱,你應該沒問題。

+0

這將無法正常工作,因爲在您的示例中對'usort'的調用無法訪問現在未實現的功能。 'sortBy'被名稱引用爲第二個參數 – 2014-10-20 14:54:43

+0

Woops,忘記了那個.. fixed – 2014-10-20 14:56:53

0

除非是匿名函數或閉包,否則不能使用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; 
} 
+0

爲什麼那個被低估? – thpl 2014-10-20 14:59:17