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

inf*_*iac 13 php static abstract

我想这个问题更倾向于语言极客.我有以下课程:

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

    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我可以调用此函数,如下所示:

ScopeFactory::doStuff()

这很愉快.我总是在abstract不能直接使用类的印象下进行编码- 它们必须由具体类实现才能被调用.

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

有人可以向我解释为什么这是合法的,如果它应该是?我很好奇细节.

Art*_*m L 9

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


ast*_*tax 5

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

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

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

    abstract public static function otherStuff();
}
Run Code Online (Sandbox Code Playgroud)

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