art*_*bot 6 php oop abstract-class
好的,所以我在这里读了很多关于此的帖子,但我认为这是一个特定的新问题.
我希望我们这里很多人错误地称之为"抽象静态方法"的功能.那就是:我想要一个类,它坚持扩展它的类实现某些静态方法.
对于不允许抽象静态的讨论问题,似乎有两条道路,但两者似乎都不优雅.
以下内容会生成错误:"PHP严格标准:静态函数A :: fn()不应该是抽象的".
<?php
abstract class A
{
     abstract static public function fn();
}
class B extends A
{
    static public function fn()
    {
         // does something on class vars etc.
    }
}
<?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的子类实现受保护的静态方法.
当方法完全依赖于静态数据但不应该从"外部"调用时,受保护的静态方法很有用.
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(),这在运行时有效.但是必须在运行时处理编码语法错误没有用.虽然这可能是一种方法的破解,但每种方法的代码都要多得多.
这种设计是否有问题,语言是否正确禁止它?奇怪的是,有各种方法可以坚持子类提供大多数类型的方法,但不提供静态方法.
这是因为静态方法属于定义它们的类。A::fn()  和B::fn()是两种不同的方法,与继承树无关。A::fn()所以定义为没有什么意义abstract。
也许您所讨论的方法根本不应该是抽象的?如果要使用任何类型的多态性,都应该涉及对象。