static关键字对常量有影响吗?

时间:2012-07-25 19:48:35

标签: php class static constants

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没有区别吗?

3 个答案:

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

你会看到差异(范围和正在解决的实例[继承与基础])

self, parent and static keywords

答案 2 :(得分:1)

是的,有区别。在示例代码中,selfstatic都引用相同的const FOO声明。

用户“drew010”发送的示例显示了差异。