PHP anonim fonksiyonlar kapsamı soru

2 Cevap php

Ben bir ortak özelliği tarafından nesnelerinin bir dizisini sıralamak için çalışıyorum, ancak ben (dış bir Tamam kullanabilirsiniz) benim $ özellik parametresi iç işlevi kayıt alınamıyor.

Ben parametresi gibi geliyordu, belgeleri okumak yolu şey yanlış var, kullanılabilir olacaktır?

İşte ne var:

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

Any advice appreciated. Thanks.

2 Cevap

Ne yazık ki, bu php çalışmaz. Hiçbir iç içe kapsamı vardır, her bir işlev kendi yerel kapsamı vardır. Bunun yanı sıra, tüm fonksiyonlar olursa olsun beyan nerede, geneldir ve sadece bir kez ilan edilebilir, böylece sortObjectsByProperty birden çok kez çağrılır olacak eğer bir hata mesajı alırsınız.

PHP5.3 Eğer örneğin, lambdas kullanarak bu çözüm bulabilirsiniz

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

PHP bu gibi işlevleri embed olamaz. Ne yapabilirsiniz, ama, özel bir statik fonksiyonu kullanımı olun:

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