我有一个抽象类,它有一个使用静态函数的方法。这个静态函数是在子类中定义的,并且对于每个子类都是不同的。将使用哪个子类来创建对象是在脚本中确定的。请参阅下面的 super 简化代码:
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();
这段代码给了我这个错误:
Fatal error: Cannot call abstract method iFooClass::getSomething() in C:\wamp\www\Classes\fooClass.php on line 12
我认为,既然子类可以访问父类(super class)方法 getBar
,那么它将从子类中调用,从而可以访问其静态函数。显然不是。有没有办法重做这个以使其工作?
最佳答案
我认为首先你应该在“fooClass”中实现“iFooClass”接口(interface)的“getSomething”方法,因为所有接口(interface)函数都必须在子类中实现,这是接口(interface)的基本规则。只有在此之后,您才能将此函数包含到另一个类方法中。
编辑:抽象类有能力不实现所有接口(interface)方法(如果它们在其子类中实现)。
Edit2 当您使用 Self 关键字调用方法时,它会从“SELF”实际存在的类中调用方法,而不是从我们调用方法的类对象中调用方法。这就是为什么 self::method() 应该更改为 static::method()
关于php - 在 PHP 的扩展类中使用静态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29059039/