【问题标题】:PHP anonymous functions scope questionPHP匿名函数范围问题
【发布时间】:2010-04-27 15:54:23
【问题描述】:

我正在尝试按公共属性对对象数组进行排序,但是我无法让我的 $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;
  }

任何建议表示赞赏。 谢谢。

【问题讨论】:

    标签: php anonymous-function usort


    【解决方案1】:

    不幸的是,这在 php 中不起作用。没有嵌套作用域,每个函数都有自己的局部作用域。除此之外,所有的函数,无论在哪里声明,都是全局的,并且只能声明一次,所以如果 sortObjectsByProperty 被多次调用,你会得到一个错误信息。

    在 php5.3 中,您可以通过使用 lambdas 来解决这个问题,例如

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

    【讨论】:

      【解决方案2】:

      你不能在 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);
        }
      }
      

      【讨论】:

      • 你可以在函数中嵌入函数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 2013-02-09
      • 2013-06-25
      • 1970-01-01
      • 2011-02-13
      相关资源
      最近更新 更多