首页 > 解决方案 > get_call_class() 和 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'

在这两种情况下它似乎都起作用,但我应该注意一些细微差别。

标签: phpclassstatic

解决方案


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_call_class 耗时 0.0559 秒

Child, static::class 耗时 0.0468 秒

孩子,get_call_class 花了 0.0554 秒

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


推荐阅读