在PHP7中使用static::MY_CONST vs self::MY_CONST vs SomeClass::MY_CONST引用常量

在PHP7中使用static::MY_CONST vs self::MY_CONST vs SomeClass::MY_CONST引用常量,php,php-7,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; } }

我想一劳永逸地说清楚

我很确定我知道什么时候使用
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;
    }
}
class Bar
{
    const MY_CONST = 123;
}

class Foo 
{
    public function example() 
    {
        echo Bar::MY_CONST;
    }
}
您使用另一个类::MY_CONST

…当您引用一个常量时,该常量定义在不同的类中,而您称之为的类是不同的类

例如:

class Foo 
{
    const MY_CONST = 123;

    public function example() 
    {
        echo self::MY_CONST;
    }
}
class Bar
{
    const MY_CONST = 123;
}

class Foo 
{
    public function example() 
    {
        echo Bar::MY_CONST;
    }
}
您使用static::MY_CONST

…什么时候?我不知道。就引用常量而言,使用
static
对我来说毫无意义。请提供有效的理由或确认
self::
SomeClass::
示例足够


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

此示例将向您展示所有差异:

<?php

class A
{
    const TEST = 'A';

    static function echoSelf()
    {
        echo self::TEST . PHP_EOL;
    }

    static function echoStatic()
    {
        echo static::TEST . PHP_EOL;
    }
}

class B extends A
{
    const TEST = 'B';
}

echo 'Using self:' .PHP_EOL;
A::echoSelf(); // A
B::echoSelf(); // A

echo 'Using static:' .PHP_EOL;
A::echoStatic(); // A
B::echoStatic(); // B

所谓的“后期静态绑定”需要使用
static
关键字(另请参见)。答案不是最清楚的,但这句话是关键:

“后期绑定”源于这样一个事实,即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();
这将输出
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();

现在它将回显
456
,因为
静态::
解析为我们在调用时实际使用的类,它是
Bar
,并且
Bar::MY_CONST
具有不同的值。

Hi@PierreDuc的可能重复,我不认为这是重复。我有一个明确的问题,与
$this
无关。@slick的可能重复:它是重复的,但不是PierreDuc选择的。不过也有。你可能在做一些研究时发现了这一点。我认为@IMSoP提供了一个很好的例子,我可以看到一些不同之处。我的结论是,如果我只在一个没有继承的类中操作,我可以继续使用
self::
,否则
static::
将是一种方法,对吗?哇,现在更清楚了。所以基本上,当您有继承时,使用
静态
似乎是一种方法,但是当您仅在单个类中操作时,
自身
就足够了,对吗?