No.364


【PHP】self::とstatic::の違い

クラス定数の値が違う…スコープか!

 しょっちゅうやってしまうのがクラス定数のスコープ違い。

 selfstaticは語感的に意味が逆のような気がするんだけど…


self

 その定義を記載したClassそのもので定義されているもの。
 基底クラスでself::と記述すると、基底クラスのものを参照する。
 継承された派生クラスで定義された値は見ない。

static

 その定義を記載したClassそのもので定義されているもの。
 基底クラスでstatic::と記述すると、継承された派生クラスのものを参照する。
 派生クラスで未定義の場合は、もちろん基底クラスの値を見る


サンプル

 selfでは基底クラスの値が表示される。

class hoge {
  const STR = 'hoge';

  public function disp() {
    echo self::STR;
  }
}

class fuga {
  const STR = 'fuga';
}

$fuga = new fuga();

$fuga->disp();
↓
hoge  < 基底クラスhogeの値

 staticでは派生クラスの値が表示される。

class hoge {
  const STR = 'hoge';

  public function disp() {
    echo static::STR;
  }
}

class fuga {
  const STR = 'fuga';
}

$fuga = new fuga();

$fuga->disp();
↓
fuga  < 派生クラスfugaの値