スコープ定義演算子

端的には「クラス名::メソッド名()」や「クラス名::$プロパティ名」といった書式の :: (コロン二つ)の事を「スコープ定義演算子」と言います。
スコープ定義演算子は、主に「静的(static)なメソッド」や「静的(static)なプロパティ」にアクセスをするときに使われます。

静的なメソッドやプロパティは、通常普通のクラスが「newをして出来たインスタンスを介してアクセスする」のに対して「特にインスタンスを作成せず、クラス名から直接アクセスする」のが特徴です。

簡単に例を書くと、以下のようなコードになります。

<?php

// 通常の(動的な)クラスの宣言
class Hoge
{
    // 通常の(動的な)メソッド
    public function test()
    {
        echo "hoge test({$this->i})\n";
        $this->i = mt_rand(0, 999); // 通常の(動的な)プロパティへのアクセス
    }
//
private $i = 0;
}
// 通常の(動的な)クラスの使用
$obj = new Hoge(); // インスタンスの作成
$obj->test(); // 通常の(動的な)メソッドのcall
$obj->test(); // 通常の(動的な)メソッドのcall
$obj->test(); // 通常の(動的な)メソッドのcall

// 静的なクラスの宣言
class StaticHoge
{
    // 静的なメソッド
    public static function test()
    {
        $i = self::$i;
        echo "hoge test({$i})\n";
        self::$i = mt_rand(0, 999); // 静的なプロパティへのアクセス
    }
//
private static $i = 0;
}
// 静的なクラスの使用
StaticHoge::test(); // 静的なメソッドのcall
StaticHoge::test(); // 静的なメソッドのcall
StaticHoge::test(); // 静的なメソッドのcall

上述で「self::」とありますが、これは「自分自身のクラス名」を意味します。比較的よく使われる書き方なので、すこし覚えておくとよいでしょう。

ただ、self::は「継承の時に困った事を起こす可能性」があるので。
そのあたりについては「遅延静的束縛 (Late Static Bindings)」を理解するとよいでしょう。

また、「3つのstatic」を見ておくと、少し面倒ではありますが、理解の一助になるかもしれません。


この記事が気に入ったらサポートをしてみませんか?