我想一劳永逸地说清楚。
我很确定我知道什么时候使用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;
}
}
您使用AnotherClass::MY_CONST…
…当你引用一个在不同类中定义的常量,而不是你称之为的那个。
示例:
class Bar
{
const MY_CONST = 123;
}
class Foo
{
public function example()
{
echo Bar::MY_CONST;
}
}
您使用static::MY_CONST…
…什么时候?我不知道。就引用常量而言,使用static
对我来说毫无意义。请提供有效的理由或确认self::
和SomeClass::
示例已足够。
编辑:我的问题不是重复的。我根本不问关于$this
的问题。不要将此标记为副本。
发布于 2018-08-21 18:23:44
所谓的“后期静态绑定”(另请参阅What exactly are late static bindings in PHP?)需要static
关键字。manual page on that topic不是最清楚的,但这句话很关键:
静态“后期绑定”来自这样一个事实:
::不会使用定义该方法的类来解析,而是使用运行时信息来计算。
实际上,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
具有不同的值。
发布于 2018-08-21 18:20:29
这个例子将向你展示所有的区别:
<?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
享受;)
https://stackoverflow.com/questions/51946275
复制相似问题