我有一个抽象类,它有一个使用静态函数的方法。此静态函数在子类中定义,并且对于每个子类是不同的。将在脚本中确定将使用哪个子类来创建对象。请参阅下面的超简化代码:
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
,因此可以从子类调用它,从而可以访问其静态函数。显然不是。有没有办法重做这个让它工作?
答案 0 :(得分:1)
我认为首先应该从“fooClass”中的“iFooClass”接口实现“getSomething”方法,因为所有接口函数都必须在子类中实现,这是接口的基本规则。只有在此之后,您才能将此函数包含在另一个类方法中。
编辑:如果抽象类在其子类中实现,则它们无法实现所有接口方法。
Edit2 当您使用Self关键字调用方法时,它会从实际存在“SELF”的类调用方法,而不是从我们调用方法的类对象调用方法。这就是为什么应该用static :: method()
更改self :: method()的原因