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

时间:2018-05-23 11:55:22

标签: php class static

在静态类方法中调用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 个答案:

答案 0 :(得分:3)

static::class was "only" added in 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();});
  

Parent,static :: class花了0.0467秒

     

Parent,get_called_class花了0.0559秒

     

Child,static :: class花了0.0468秒

     

Child,get_called_class花了0.0554秒

但你必须做好六位数的迭代才能注意到。请参阅https://3v4l.org/qaXln(3v4l肯定不是基准测试的最佳工具,但有足够的模式)