我有一个带有函数func()的A类。
我有3个B,C,D类延伸A.
A :: func()应该调用B :: func(),C :: func()...
我想使用静态函数,因为我不需要实例化每个孩子。
我认为A应该是抽象的(我希望它是)。
我如何在PHP中执行此操作?
答案 0 :(得分:0)
声明它abstract但是一旦你将函数设为静态就无法测试它(PHPUnit),你就不能模拟静态方法。
abstract class C
{
static function func()
{
echo 'base';
}
}
abstract class B extends C
{
static function func()
{
parent::func();
echo 'B';
}
}
class A extends B
{
static function func()
{
parent::func();
echo 'A';
}
}
A::func(); //Displays: baseBA
答案 1 :(得分:-1)
我终于这样做了:
final class A
{
public static function call($sFunctionName) {
$aClasses = ['B', 'C'];
foreach ($aClasses as $sClassName) {
if (method_exists($sClassName, $sFunctionName)) {
call_user_func($sClassName.'::'.$sFunctionName);
}
}
}
}
这仍然是糟糕的设计吗?类的数组实际上是在外部配置文件中定义的。
答案 2 :(得分:-1)
您也可以这样做:
abstract class A
{
protected static function func()
{
echo 'base';
}
public static function extFunc()
{
static::func();
}
}
class B extends A
{
protected static function func()
{
parent::func();
echo 'B';
}
}
class C extends A
{
protected static function func()
{
parent::func();
echo 'C';
}
}
C::extFunc(); //Displays: baseC
你有一个从内部调用受保护方法的公共方法。