我想一劳永逸地说清楚.
我很确定我知道何时使用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.不要将此标记为重复.
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具有不同的值。
| 归档时间: |
|
| 查看次数: |
273 次 |
| 最近记录: |