好的,我已经阅读了这里关于这个问题的帖子,但我认为这是一个具体而新的问题。
我想要的功能是我们错误地称之为“抽象静态方法”的功能。也就是说:我想要一个类,该类要求扩展它的类实现某些静态方法。
似乎有两种方法可以解决不允许抽象静态的常见问题,但两种方法都不太优雅。
问题
以下会生成一个错误:“PHP Strict Standards:Static function A::fn() should not be abstract”。
<?php
abstract class A
{
abstract static public function fn();
}
class B extends A
{
static public function fn()
{
// does something on class vars etc.
}
}
解决方案1:使用接口
<?php
interface iA {
static function fn();
}
abstract class A implements iA
{
} // obviously this would have other stuff in it in reality
class B extends A
{
static public function fn()
{
// does something on class vars etc.
}
}
这样做的问题在于接口假定(规定)所有方法都是公共的。因此,虽然这实现了要求抽象类的子类具有某些静态方法的目标,但它只能用于公共方法;仍然无法确保A的子类实现受保护的静态方法。
当方法完全在静态数据上工作但不应从“外部”调用时,受保护的静态方法非常有用。
解决方案2:异常
abstract class A
{
static public function fn()
{
throw new Exception(get_called_class() . " must implement fn()");
}
}
class B extends A
{
static public function fn()
{
// does something on class vars etc.
}
}
这在运行时如果调用fn()是有效的。但是在运行时处理编码语法错误并不实用。而且,虽然这可能是一种方法的hack,但对于每种方法来说需要更多的代码。 这个设计有什么问题,以至于语言正确地禁止它吗?看起来很奇怪,有各种方式要求子类提供大多数类型的方法,但不包括静态方法。