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

时间:2014-12-18 14:24:27

标签: php oop usort static-classes

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

在处理的某个时刻,扩展类将调用parent :: doThis(),而doThis最终会执行一次操作。

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()"
  }
}

3 个答案:

答案 0 :(得分:4)

我认为您应该可以使用Late Static Bindings执行此操作:

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

答案 1 :(得分:2)

您可以使用自己的名称为每个班级添加static function name() { return "myCallingClass"; }。然后你只需要打电话

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

static modifer向您保证,如果有一个方法,则会从继承类中调用该方法。

答案 2 :(得分:2)

一个简单的解决方案是将一个众所周知的回调名称与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