【问题标题】:Calling a public, static function in an abstract class在抽象类中调用公共静态函数
【发布时间】:2015-07-08 22:07:26
【问题描述】:

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

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

    }
}

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

ScopeFactory::doStuff()

这很愉快。我一直认为abstract 类不能直接使用——它们必须由具体类实现才能调用。

我对@9​​87654325@ 的印象是它不需要实例 即可调用。

有人可以向我解释为什么这是合法的,是否应该合法?我很好奇更详细的细节。

【问题讨论】:

标签: php static abstract


【解决方案1】:

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

【讨论】:

  • 我很想知道(在低级别)这是如何在 PHP 运行时实现的 - 有什么见解吗? 内部状态是指抽象类的内部状态
  • 内部状态是指内部状态。静态方法不应该在内部保存任何东西,从而改变内部状态。例如。只需获取输入,执行操作并输出与相同输入相同的结果。您可以只威胁静态方法,如一般 PHP 函数。
【解决方案2】:

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

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

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

    abstract public static function otherStuff();
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 2012-12-03
    • 2015-09-13
    相关资源
    最近更新 更多