2010-04-27 83 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