在抽象类中调用公共静态函数

2022-08-30 22:22:04

我想这个问题更适合语言极客。我有以下类:

<?php  
abstract class ScopeFactory
{
    public static function doStuff()
    {

    }
}

现在,我可以调用这个函数,就像这样:

ScopeFactory::doStuff()

这很愉快。我一直以类不能直接使用的印象进行编码 - 并且它们必须由具体类实现才能可调用。abstract

我的印象是,它不需要实例是可调用的。static

有人可以向我解释为什么这是合法的,如果应该是合法的吗?我对更精细的细节感到好奇。


答案 1

OOP 中的静态方法不会更改内部状态,因此您可以从抽象类中调用静态方法。


答案 2

如果不允许这样做,我会感到惊讶。抽象类假定您无法实例化它。由于静态方法不需要类实例,因此您可以愉快地使用它们。

更深入地看,您可以创建一个抽象的静态方法,并从非抽象方法中调用它:

abstract class ScopeFactory
{
    public static function doStuff()
    {
        static::otherStuff();
    }

    abstract public static function otherStuff();
}

PHP会给你一个致命的错误,说你不能调用抽象的方法。但它也会给你一个E_STRICT警告,说你不应该创建抽象的静态方法。


推荐