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

Kub*_*ski 3 php static class

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'
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,它的工作原理似乎相同,但可能有一些我应该注意的细微差别。

iai*_*inn 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();});
Run Code Online (Sandbox Code Playgroud)

父级,static::class 花费了 0.0467 秒

父级,get_called_class 花费了 0.0559 秒

子级,static::class 花费了 0.0468 秒

孩子,get_called_class 花费了 0.0554 秒

但你必须在六位数的迭代中表现出色才能注意到。请参阅https://3v4l.org/qaXln(3v4l绝对不是基准测试的最佳工具,但有足够的模式)

  • 因此,考虑到 `static::class` 更快一点并且与 `get_used_class` 工作方式相同,没有理由在现代应用程序中使用后者? (2认同)
  • @KubaSzymanowski 是的,完全正确。返回并更改旧代码是不够的,但新代码不妨使用稍快的版本。至少在我看来,它也更好一点。 (2认同)