【问题标题】:PHP Usort in a parent static class with callback in the calling static class父静态类中的PHP Usort,调用静态类中的回调
【发布时间】:2015-02-17 08:51:29
【问题描述】:

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

在处理过程中的某个时刻,扩展类将调用 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()"
  }
}

【问题讨论】:

  • 两种解决方案都可以,但是如果您需要放置不同的回调,请使用#2,这样您就可以随时在回调之间切换
  • 问题有问题吗?我看到它被否决了。

标签: php oop usort static-classes


【解决方案1】:

我认为你应该可以使用Late Static Bindings 做到这一点:

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

【讨论】:

  • 这样会很好,但还没有在php中实现。
  • @georg 什么没有实现?后期静态绑定自 5.3(约 5 年)以来一直在 PHP 中。
  • 引用here
  • 刚试过。在父级中,我有 public static function p() {print 'hello';} 和 public static function test() {static::p();} 然后在扩展类 public static function p() {print' goodbye';} 并在扩展类中调用 self::test() 会导致 'goodbye';还没用usort尝试过……那是什么没有实现?
  • 如果 usort 不直接获取静态可调用对象,您可能需要将其包装在闭包中:usort($data, function($a, $b) {return(static::cmp($a,$b));});
【解决方案2】:

您可以将static function name() { return "myCallingClass"; } 添加到每个具有自己名称的类中。那么你只需要打电话

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

staticmodifer 向您保证,如果继承类有一个方法,该方法将被调用。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-04
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      相关资源
      最近更新 更多