在父级的所有子级中调用同名函数

时间:2015-09-07 09:26:40

标签: php

我有一个带有函数func()的A类。

我有3个B,C,D类延伸A.

A :: func()应该调用B :: func(),C :: func()...

我想使用静态函数,因为我不需要实例化每个孩子。

我认为A应该是抽象的(我希望它是)。

我如何在PHP中执行此操作?

3 个答案:

答案 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

你有一个从内部调用受保护方法的公共方法。