仅通过子类

时间:2018-05-16 20:27:22

标签: php

让我们说我的抽象父类中有一些函数。我希望这些只能由子类访问,所以我标记函数protected(非静态)。

abstract class ParentClass
{      
  protected function myFunction()
  {
     //implementation
  }
}

我的问题如下:我有一些子课程,其中大多数都使用前面提到的protected函数。我想创建一个子类,它允许程序员直接使用这些函数。

基本上是这样的:

class ChildClass extends ParentClass
{
  public static function myAwesomeFunction()
  {
    parent::myFunction();
  }      
}

这就是我想要做的。我希望用户能够以静态方式从子类中调用该函数(可以在子类中使用相同名称 - myFunction),但不能从父类调用(这就是为什么我不想让这个函数公开,加上因为我希望它是静态的,标记类摘要对此没有帮助)。

能够致电

ChildClass::myAwesomeFunction();

但无法做到

ParentClass:myFunction();

有没有诀窍来实现这一目标?如果没有,这样做的最佳做法是什么?唯一的方法是枚举我想要的所有函数并让它们调用父方法(就像我在我的例子中那样)?

1 个答案:

答案 0 :(得分:0)

您可以将摘要定义为protected static,然后在子项中使用self关键字:

abstract class A
{
    protected static function _foo() {
        echo "foo\n";
    }
}

class B extends A
{
    public static function foo() {
        self::_foo();
    }
}

A::_foo(); // fatal
B::foo(); // works

考虑到这一点,我并不是真的对这种技术感到疯狂,我一般建议避免使用静态方法 - 然后只需要定义抽象保护并让孩子继承它。