2010-04-27 147 views
2

我想通過一個公共屬性對對象數組進行排序,但是我不能讓我的$ property參數在內部函數中註冊(我可以在外部函數中使用OK)。PHP匿名函數範圍問題

我閱讀文檔的方式,聽起來像參數可用,我誤解了一些東西?

以下是我有:

public static function sortObjectsByProperty($objects, $property) 
    {  
     function compare_object($a, $b) 
     { 
      $a = $a->$property; 
      $b = $b->$property; 

      if ($a->$property == $b->$property) 
      { 
       return 0; 
      }  

      return ($a->$property > $b->$property) ? +1 : -1;   
     } 

     usort($objects, 'compare_object'); 
     return $objects; 
    } 

任何意見讚賞。 謝謝。

回答

7

不幸的是,這在php中不起作用。沒有嵌套作用域,每個函數都有自己的局部作用域。除此之外,所有函數,無論它們在哪裏聲明,都是全局函數,只能聲明一次,因此如果sortObjectsByProperty將被多次調用,您將收到錯誤消息。

在PHP5.3您可以解決此通過使用lambda表達式,例如

function sortObjectsByProperty($objects, $property) 
{  
     $compare_object = function($a, $b) use($property) 
     { 
      $a = $a->$property; 
      $b = $b->$property; 

      if ($a->$property == $b->$property) 
      { 
       return 0; 
      }  

      return ($a->$property > $b->$property) ? +1 : -1;   
     }; 

     usort($objects, $compare_object); 
     return $objects; 
    } 
-1

在PHP中你不能嵌入這樣的功能。但是,您可以執行的操作是使用私有靜態功能:

class myClass { 
    private static function compare_object($a, $b) { 
    // do stuff 
    } 
    public function sortObjectsByProperty($objects, $property) { 
    $a = new a(); 
    $b = new b(); 
    self::compare_object($a, $b); 
    } 
} 
+5

您可以在函數中嵌入函數。 – zaf 2010-04-27 16:04:12