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



我想一劳永逸地说清楚。

我很确定我知道何时使用self::MY_CONSTSomeClass::MY_CONST但不清楚何时使用static::MY_CONST

你使用self::MY_CONST...

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

例:

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

您使用 OtherClass::MY_CONST...

。当您引用在与调用它的类不同的类中定义的常量时。

例:

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

您使用静态::MY_CONST...

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

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

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();

这将输出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,因为static::解析为我们在运行时实际使用的类,该类是Bar,并且Bar::MY_CONST具有不同的值。

这个例子将向你展示所有的区别:

<?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

享受;)

最新更新