在PHP中使用扩展类中的静态函数

时间:2015-03-15 09:14:21

标签: php class object abstract-class static-methods

我有一个抽象类,它有一个使用静态函数的方法。此静态函数在子类中定义,并且对于每个子类是不同的。将在脚本中确定将使用哪个子类来创建对象。请参阅下面的超简化代码:

abstract class fooClass implements iFooClass {    
    function getBar(){
        $bar = self::getSomething();
        return $bar;
    }        
}

interface iFooClass{
    static function getSomething();
}

class fooSubClass_A extends fooClass {
    static function getSomething() {
        //do something;
        //return something;
    }
}

class fooSubClass_B extends fooClass {
    static function getSomething() {
        //do something else;
        //return something else;
    }
}

$foo = New fooSubClass_A;
$bar = $foo->getBar();

这段代码给了我这个错误:

  

致命错误:无法在第12行的C:\ wamp \ www \ Classes \ fooClass.php中调用抽象方法iFooClass :: getSomething()

我认为,由于子类可以访问超类方法getBar,因此可以从子类调用它,从而可以访问其静态函数。显然不是。有没有办法重做这个让它工作?

1 个答案:

答案 0 :(得分:1)

我认为首先应该从“fooClass”中的“iFooClass”接口实现“getSomething”方法,因为所有接口函数都必须在子类中实现,这是接口的基本规则。只有在此之后,您才能将此函数包含在另一个类方法中。

编辑:如果抽象类在其子类中实现,则它们无法实现所有接口方法。

Edit2 当您使用Self关键字调用方法时,它会从实际存在“SELF”的类调用方法,而不是从我们调用方法的类对象调用方法。这就是为什么应该用static :: method()

更改self :: method()的原因