我今天问了自己同样的问题,我想加两分钱。
我们想要abstract 属性的原因是确保子类定义它们并在没有定义它们时抛出异常。在我的具体情况下,我需要一些可以与statically 配合使用的东西。
理想情况下,我想要这样的东西:
abstract class A {
abstract protected static $prop;
}
class B extends A {
protected static $prop = 'B prop'; // $prop defined, B loads successfully
}
class C extends A {
// throws an exception when loading C for the first time because $prop
// is not defined.
}
我最终完成了这个实现
abstract class A
{
// no $prop definition in A!
public static final function getProp()
{
return static::$prop;
}
}
class B extends A
{
protected static $prop = 'B prop';
}
class C extends A
{
}
如您所见,在A 中我没有定义$prop,但我在static getter 中使用它。因此,以下代码有效
B::getProp();
// => 'B prop'
$b = new B();
$b->getProp();
// => 'B prop'
另一方面,在C 中,我没有定义$prop,所以我得到了异常:
C::getProp();
// => Exception!
$c = new C();
$c->getProp();
// => Exception!
我必须调用 getProp() 方法来获取异常,我无法在类加载时获取它,但它非常接近所需的行为,至少在我的情况下。
我将getProp() 定义为final 以避免某些聪明人(也就是6 个月后的我自己)想要这样做
class D extends A {
public static function getProp() {
// really smart
}
}
D::getProp();
// => no exception...