2010-04-27 2 views
2

Я пытаюсь сортировать массив объектов по общему свойству, однако я не могу заставить свой параметр $ property регистрироваться во внутренней функции (я могу использовать его во внешнем OK).PHP anonymous functions scope question

Как я читал документацию, это звучало как параметр был бы доступен, я что-то не понял?

Вот что у меня есть:

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 вы можете обойти эту проблему с помощью лямбды, например

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