class A{
const FOO = 1;
}
class B extends A{
const FOO = 5;
function foo(){
print self::FOO;
print static::FOO;
}
}
$b = new B;
$b->foo();
在两种情况下都打印5个。
所以在常量上使用static vs self没有区别吗?
答案 0 :(得分:3)
在Late Static Binding的背景下,存在差异。
考虑以下代码:
<?php
class A {
const FOO = 1;
function bar() {
print self::FOO;
print "\n";
print static::FOO;
}
}
class B extends A {
const FOO = 5;
}
$b = new B;
$b->bar(); // 1 5
如果运行此代码,输出将为:
1
5
引用self::FOO
时,会打印1
的值(即使在课程bar()
上调用了B
,但在使用static
关键字时,后期静态绑定生效,并在使用static关键字时引用FOO
而不是B
的{{1}}常量。
这与PHP 5.3及更高版本相关。
答案 1 :(得分:2)
在你的例子中,没有足够的东西看到差异。但是,如果你有:
class Foo
{
protected static $FooBar = 'Foo';
public function FooBar()
{
echo "static::\$FooBar = " . static::$FooBar . PHP_EOL;
echo "self::\$FooBar = " . self::$FooBar . PHP_EOL;
}
}
class Bar extends Foo
{
protected static $FooBar = 'Bar';
}
$bar = new Bar();
$bar->FooBar();
你会看到差异(范围和正在解决的实例[继承与基础])
答案 2 :(得分:1)
是的,有区别。在示例代码中,self
和static
都引用相同的const FOO
声明。
用户“drew010”发送的示例显示了差异。