在 PHP 中的扩展 class 中使用静态函数
Using static function in extended class in PHP
我有一个抽象 class,它有一个使用静态函数的方法。这个静态函数在 sub-classes 中定义,并且对于每个 sub-class 都是不同的。哪个sub-class 将被用于创建对象是在脚本中确定的。请参阅下面的超级简化代码:
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
我想既然 sub-classes 可以访问 super-classes 方法 getBar
它会从 sub-class 调用因此有访问其静态函数。显然不是。有没有办法重做它以使其工作?
我认为首先你应该在 "fooClass" 中实现 "iFooClass" 接口中的 "getSomething" 方法,因为所有接口功能都必须在子 class 中实现,这是基本规则接口。只有在那之后,您才能将此函数包含到另一个 class 方法中。
编辑:抽象classes有能力不实现所有接口方法,如果它们在它的子classes中实现。
Edit2 当您使用 Self 关键字调用方法时,它会从 class 实际存在的 class 调用方法,而不是从 class 对象调用方法我们从中调用方法。这就是为什么 self::method() 应该更改为 static::method()
我有一个抽象 class,它有一个使用静态函数的方法。这个静态函数在 sub-classes 中定义,并且对于每个 sub-class 都是不同的。哪个sub-class 将被用于创建对象是在脚本中确定的。请参阅下面的超级简化代码:
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
我想既然 sub-classes 可以访问 super-classes 方法 getBar
它会从 sub-class 调用因此有访问其静态函数。显然不是。有没有办法重做它以使其工作?
我认为首先你应该在 "fooClass" 中实现 "iFooClass" 接口中的 "getSomething" 方法,因为所有接口功能都必须在子 class 中实现,这是基本规则接口。只有在那之后,您才能将此函数包含到另一个 class 方法中。
编辑:抽象classes有能力不实现所有接口方法,如果它们在它的子classes中实现。
Edit2 当您使用 Self 关键字调用方法时,它会从 class 实际存在的 class 调用方法,而不是从 class 对象调用方法我们从中调用方法。这就是为什么 self::method() 应该更改为 static::method()