Вопрос об области анонимных функций PHP

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

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

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

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

Любые советы приветствуются. Спасибо.


person Dan    schedule 27.04.2010    source источник


Ответы (2)


К сожалению, в 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;
  }
person user187291    schedule 27.04.2010

Вы не можете встроить подобные функции в 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);
  }
}
person Stephen Fuhry    schedule 27.04.2010
comment
Вы можете встраивать функции в functions. - person zaf; 27.04.2010