2010-04-27 9 views
2

J'essaie de trier un tableau d'objets par une propriété commune, mais je ne peux pas obtenir mon paramètre $ property pour s'enregistrer dans la fonction interne (je peux l'utiliser dans la fonction externe OK).PHP fonctions anonymes portée question

La façon dont j'ai lu la documentation, il semblait que le paramètre serait disponible, ai-je mal compris quelque chose?

Voici ce que j'ai:

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

Tout conseil apprécié. Merci.

Répondre

7

Malheureusement, cela ne fonctionnera pas en php. Il n'y a pas de portée imbriquée, chaque fonction a sa propre portée locale. De plus, toutes les fonctions, peu importe où elles sont déclarées, sont globales et ne peuvent être déclarées qu'une seule fois. Vous obtiendrez donc un message d'erreur si sortObjectsByProperty sera appelé plus d'une fois.

à PHP5.3 vous pouvez contourner ce problème en utilisant lambdas, par exemple

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

Vous ne pouvez pas intégrer des fonctions telles que PHP. Ce que vous pouvez faire, cependant, est d'utiliser une fonction statique privée:

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

Vous pouvez intégrer des fonctions dans des fonctions. – zaf