get_called_class() 和 static::class 之间的区别

3

在静态类方法中,调用get_called_class()static::class有什么区别?

例如:

class Base
{
    public static function foo()
    {
        return static::class;
    }

    public static function bar()
    {
        return get_called_class();
    }
}

class Child extends Base {}

echo Base::foo();  // prints 'Base'
echo Base::bar();  // prints 'Base'
echo Child::foo(); // prints 'Child'
echo Child::bar(); // prints 'Child'

看起来在这两种情况下它的工作方式都是相同的,但是我应该注意一些细微差别。

1个回答

5

static::class 仅在PHP 5.5中添加, 除此之外,它们应该是完全相同的。

从快速测试来看,static::class似乎略微更快。使用问题中的代码:

profile("Parent, static::class", function () { Base::foo();});
profile("Parent, get_called_class", function () { Base::bar();});
profile("Child, static::class", function () { Child::foo();});
profile("Child, get_called_class", function () { Child::bar();});

父类,static::class 耗时 0.0467 秒

父类,get_called_class 耗时 0.0559 秒

子类,static::class 耗时 0.0468 秒

子类,get_called_class 耗时 0.0554 秒

但你需要进行数十万次迭代才能注意到这一点。参见 https://3v4l.org/qaXln(3v4l 绝对不是最好的基准测试工具,但有足够的模式)


2
所以考虑到 static::class 更快且与 get_called_class 的功能相同,现代应用程序中没有理由使用后者? - Kuba Szymanowski
2
@KubaSzymanowski 是的,完全正确。这并不足以改变旧代码,但新代码可以使用稍微更快的版本。至少在我看来,这也有点更好。 - iainn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接