接口:需要一个抽象常量?

时间:2012-01-06 22:48:44

标签: php oop interface

我有一个班级ParentClass(),一些子班级ChildClass1()ChildClass2()等,以及一个界面iChild()ChildClass()继承自ParentClass()并实施iChild()

class ChildClass1 
    extends ParentClass 
    implements iChild {}

class ChildClass2 
    extends ParentClass 
    implements iChild {}

iChild() - 接口中,我想要求一些常量需要填充(主要是标识符和一些功能定义)。我没有发现任何意义这样做,因为常量只能在接口中定义,但在实现类中不能重新定义。我找到的唯一解决方法是在iChild()中定义一些getter-functions,然后返回必要的值,但这似乎不是正确的方法。由于我已经从ParentClass()扩展,我也不能使用抽象类来例如检查所有ChildClasses中所需常量的定义。

关于如何解决这个问题的任何想法?


更新:回答评论 - 更精简,更具可读性我的意思是:

class ChildClass1 {
    const MY_NAME = "Foo Bar Name 1";
}

-- vs --

class ChildClass1 {
    public function GetMyName() {
        return "Foo Bar Name 1";
    }
}

我发现第一个例子比第二个例子更易读和易懂。不幸的是,我目前无法通过ChildClasses强制执行MY_NAME。

1 个答案:

答案 0 :(得分:3)

我不确定这里的正确解是一个常数。常量的定义是它不会改变。如果iChild的每个实现都需要定义常量,那么它实际上不是常量,它是一个变量。我建议添加适当的getter方法,与用户沟通,他们需要在实现中提供这些信息。


好的,我做了一些测试,一个类无法覆盖它正在实现的接口或它正在扩展的父类的常量集。似乎在编译时检查类常量,如果您尝试覆盖它,则会引发致命错误。对于您要做的事情,适当的答案是在您的界面中提供getter方法。