使用static :: MY_CONST vs self :: MY_CONST vs SomeClass :: MY_CONST引用PHP 7中的常量

Mat*_*cki 5 php php-7

我想一劳永逸地说清楚.

我很确定我知道何时使用self::MY_CONST,SomeClass::MY_CONST但目前还不清楚何时使用static::MY_CONST.

你使用self :: MY_CONST ......

...当您引用在您调用它的同一个类中定义的常量.

例:

class Foo 
{
    const MY_CONST = 123;

    public function example() 
    {
        echo self::MY_CONST;
    }
}
Run Code Online (Sandbox Code Playgroud)

你使用AnotherClass :: MY_CONST ......

...当你引用一个在不同类中定义的常量时,就是你所谓的常量.

例:

class Bar
{
    const MY_CONST = 123;
}

class Foo 
{
    public function example() 
    {
        echo Bar::MY_CONST;
    }
}
Run Code Online (Sandbox Code Playgroud)

你使用static :: MY_CONST ......

…什么时候?我不知道.在引用常数方面,static对我来说毫无意义.请提供正确的理由或确认self::并且SomeClass::示例已足够.

编辑:我的问题不重复.我根本不问$this.不要将此标记为重复.

IMS*_*SoP 4

static所谓“后期静态绑定”需要关键字(另请参阅PHP中的后期静态绑定到底是什么?)。关于该主题的手册页不是最清楚的,但这句话很关键:

“后期绑定”来自这样一个事实:static:: 不会使用定义该方法的类来解析,而是使用运行时信息来计算。

实际上,static::与 类似,因为它解析为运行$this代码的类,该类可能是编写代码的类的子类。

让我们使用您的示例self::,并添加一个子类:

class Foo 
{
    const MY_CONST = 123;

    public function example() 
    {
        echo self::MY_CONST;
    }
}

class Bar extends Foo
{
    const MY_CONST = 456;
}

$bar = new Bar;
$bar->example();
Run Code Online (Sandbox Code Playgroud)

这将输出123,因为self::定义中的 始终引用Foo,无论您如何调用它。

但是,如果我们更改为使用后期静态绑定:

class Foo 
{
    const MY_CONST = 123;

    public function example() 
    {
        echo static::MY_CONST;
    }
}

class Bar extends Foo
{
    const MY_CONST = 456;
}

$bar = new Bar;
$bar->example();
Run Code Online (Sandbox Code Playgroud)

现在它将 echo 456,因为static::当我们进行调用时,它解析为我们在运行时实际使用的类,它是Bar,并且Bar::MY_CONST具有不同的值。