PHP Usort 在父静态类中,在调用静态类中回调


PHP Usort in a parent static class with callback in the calling static class

我有一个用作单例的"静态类"(因为永远不需要有多个实例(,以及其他扩展它并以相同方式使用的类。

在处理过程中的某个时刻,扩展类将调用 parent::d oThis((,doThis 最终会执行 usort。

usort 的回调应该在调用类中,因为每个调用类处理排序的方式不同。像"class::method(("这样的东西可以作为usort回调的字符串吗?如果是这样,有没有办法让父类知道哪个类调用了它,而无需我将其作为参数传递,以便它可以命名调用类的回调usort?

class parentClass {
  protected static function doThis($data) {
    // do stuff, then
    usort($data, "myCallingClass::cmp()"
  }
}

基于父级确定myCallingClass是什么的某些方法,或者它是否需要

class parentClass {
  protected static function doThis($data, $calling_class) {
    // do stuff, then
    usort($data, $calling_class . "::cmp()"
  }
}

我认为你应该能够使用后期静态绑定来做到这一点:

usort($data, function($a, $b) {return(static::cmp($a, $b));});

您可以使用自己的名称将static function name() { return "myCallingClass"; }添加到每个类中。然后你所需要的只是打电话

usort($data, static::name() . "::cmp()");

static修饰符向您保证,如果该方法有继承类,则将从继承类调用该方法。

一个简单的

解决方案是将众所周知的回调名称与get_called_class结合使用:

class Numbers
{
    static function sort() {
        $things = [1,2,3,4,5];
        usort($things, [get_called_class(), 'cmp']);
        print join(' ', $things);
    }
}
class Mod2 extends Numbers {
    static function cmp($a, $b) {
        return $a % 2 - $b % 2;
    }
}
Mod2::sort(); // 4 2 5 3 1

一个不那么简单但正确的解决方案是忘记所有这些"静态类"和"单例"的东西,并按照它们想要的方式使用对象:

class Numbers
{
    function sort() {
        $things = [1,2,3,4,5];
        usort($things, [$this, 'cmp']);
        print join(' ', $things);
    }
}
class Mod2 extends Numbers {
    function cmp($a, $b) {
        return $a % 2 - $b % 2;
    }
}
(new Mod2)->sort(); // 4 2 5 3 1