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

4

3 回答 3

3

后期静态绑定的上下文中存在差异。

考虑这段代码:

<?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()在 class 上调用了B,但是当使用static关键字时,后期静态绑定生效,并且它引用了FOO常量 fromB而不是A使用 static 关键字时。

这与 PHP 5.3 及更高版本有关。

于 2012-07-25T20:06:05.093 回答
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 , parentstatic关键字

于 2012-07-25T19:57:34.283 回答
1

是,有一点不同。在您的示例代码中,两者都self引用static相同的const FOO声明。

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

于 2012-07-25T21:02:54.687 回答