让我们说我的抽象父类中有一些函数。我希望这些只能由子类访问,所以我标记函数protected
(非静态)。
abstract class ParentClass
{
protected function myFunction()
{
//implementation
}
}
我的问题如下:我有一些子课程,其中大多数都使用前面提到的protected
函数。我想创建一个子类,它允许程序员直接使用这些函数。
基本上是这样的:
class ChildClass extends ParentClass
{
public static function myAwesomeFunction()
{
parent::myFunction();
}
}
这就是我想要做的。我希望用户能够以静态方式从子类中调用该函数(可以在子类中使用相同名称 - myFunction
),但不能从父类调用(这就是为什么我不想让这个函数公开,加上因为我希望它是静态的,标记类摘要对此没有帮助)。
能够致电
ChildClass::myAwesomeFunction();
但无法做到
ParentClass:myFunction();
有没有诀窍来实现这一目标?如果没有,这样做的最佳做法是什么?唯一的方法是枚举我想要的所有函数并让它们调用父方法(就像我在我的例子中那样)?
答案 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
考虑到这一点,我并不是真的对这种技术感到疯狂,我一般建议避免使用静态方法 - 然后只需要定义抽象保护并让孩子继承它。