从类继承Interface调用静态方法

时间:2012-01-22 12:30:20

标签: php

  

可能重复:
  Referring to a static member of a subclass

请查看以下代码以了解我的问题。

<?php

Interface IDoesSomething
{
    public static function returnSomething();
}

abstract class MiddleManClass implements IDoesSomething
{
    public static function doSomething()
    {
        return 1337 * self::returnSomething();
    }
}

class SomeClass extends MiddleManClass
{
    public static function returnSomething()
    {
        return 999;
    }
}

// and now, the vicious call
$foo = SomeClass::doSomething();

/**
 * results in a
 * PHP Fatal error:  Cannot call abstract method IDoesSomething::returnSomething()
 */
?>

有没有办法强制抽象returnSomething(),同时保持从抽象“中间人”类中定义的函数调用函数的可能性?看起来像是我的PHP瓶颈。

3 个答案:

答案 0 :(得分:9)

如果您的php版本&gt; = 5.3则更改

public static function doSomething()
{
    return 1337 * self::returnSomething();
}

public static function doSomething()
{
    return 1337 * static::returnSomething();
}

答案 1 :(得分:2)

你为什么使用静力学,这不是很好的OOP?静态不适合用于继承,因为它们旨在提供专门用于该类的功能。这可以满足您的需求。

<?php

Interface IDoesSomething{
    public function returnSomething();
}

abstract class MiddleManClass implements IDoesSomething{
    public function doSomething(){
        return 1337 * $this->returnSomething();
    }
}

class SomeClass extends MiddleManClass{
    public function returnSomething(){
        return 999;
    }
}

$someClass = new SomeClass();
$foo = $someClass->doSomething();

答案 2 :(得分:2)

此问题称为“后期静态绑定”:php manual