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を出力します。

では、定数で静的と自己を使用することに違いはありませんか?

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()クラスBで呼び出された場合でも、staticキーワードが使用された場合、遅延静的バインディングが有効になり、静的キーワードを使用した場合ではなく、FOOから定数を参照しました。BA

これは、PHP5.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();

違いがわかります(スコープと解決されているインスタンス[継承vs.ベース])

自己静的キーワード

于 2012-07-25T19:57:34.283 に答える
1

はい、違いがあります。サンプルコードでは、との両方が同じ宣言selfを参照しています。staticconst FOO

ユーザー「drew010」によって送信された例は、違いを示しています。

于 2012-07-25T21:02:54.687 に答える