はじめに
PHPでクラス定数やstaticプロパティ、staticメソッドにアクセスする際には、スコープ定義演算子(::)を使います。今回は「クラス定数とstaticメソッドを組み合わせたコード例」を通して、その挙動を整理してみましょう。さらに、試験でひっかかりやすい「誤答パターン」との比較も紹介します。
目次
スコープ定義演算子(::)とは
PHPには「スコープ定義演算子(::)」が用意されており、以下の用途に使われます。
- クラス定数へのアクセス
- staticプロパティへのアクセス
- staticメソッドの呼び出し
- 親クラスのメソッド呼び出し(
parent::
)
オブジェクトを生成せずとも「クラスに紐づいた要素」を参照できるのが特徴です。
正しいコード例
<?php
declare(strict_types=1);
error_reporting(-1);
class Hoge {
public const NUM = 123;
public static function func() {
echo __METHOD__ , "," , self::NUM , "\n";
}
}
Hoge::func();
実行結果
Hoge::func,123
ポイント解説
Hoge::func();
→ クラスHoge
のstaticメソッドを呼び出している。
__METHOD__
→ 現在のメソッドの完全修飾名を返す。
→ この場合は Hoge::func
。
self::NUM
→ 同じクラス内にある定数NUMを参照する。
→ 値は 123
試験でひっかかりやすい「誤答パターン」
PHP8上級試験では、self::
/ static::
/ $this->
の使い分けを問う問題が頻出です。
以下の誤答例と比較してみましょう。
誤答例1: $this->NUM
を使ってしまう
class Hoge {
public const NUM = 123;
public function func() {
echo $this->NUM;
}
}
(new Hoge)->func();
実行結果:
Fatal error: Uncaught Error: Undefined property: Hoge::$NUM
理由:クラス定数は $this->
でアクセスできない。::
が必須。
誤答例2: static::NUM
と書き換える
class Hoge {
public const NUM = 123;
public static function func() {
echo static::NUM;
}
}
Hoge::func();
実行結果:
123
- 一見正しいが、
static::
は 後から継承したクラスでオーバーライド可能 な「遅延静的束縛」になる。 - 試験問題では「
self::
とstatic::
の違い」を問うケースがよく出るので注意。
まとめ
::
はクラスの「静的な要素」へアクセスするための演算子。- クラス定数・staticメソッド・staticプロパティ・親クラスの要素を呼び出すときに使用する。
self::
は「そのクラス自身」を指し、static::
は「継承先クラス」を意識した呼び出しになる。$this->
と混同しやすいが、インスタンス経由ではクラス定数にアクセスできない。
今回の例では、正しく Hoge::func,123
と出力されるため、問題文の記述は正しい。