PHP匿名函数作用域问题

发布于 2024-08-30 03:15:01 字数 649 浏览 12 评论 0原文

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

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

I'm trying to sort an array of objects by a common property, however I cannot get my $property parameter to register in the inner function (I can use it in the outer one OK).

The way I read the documentation, it sounded like the parameter would be available, have I misunderstood something?

Here is what I have:

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.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

旧瑾黎汐 2024-09-06 03:15:01

不幸的是,这在 php 中不起作用。没有嵌套作用域,每个函数都有自己的局部作用域。除此之外,所有函数,无论在何处声明,都是全局的,并且只能声明一次,因此如果多次调用 sortObjectsByProperty,您将收到错误消息。

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

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

Unfortunately, this won't work in php. There is no nested scope, each function has its own local scope. Besides that, all functions, no matter where they are declared, are global and can be declared only once, so you'll get an error message if sortObjectsByProperty will be called more than once.

in php5.3 you can work around this by using lambdas, for example

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;
  }
薄荷梦 2024-09-06 03:15:01

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

You can't embed functions like that in PHP. What you can do, though, is make use of a private static function:

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);
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文