スコープ定義演算子
端的には「クラス名::メソッド名()」や「クラス名::$プロパティ名」といった書式の :: (コロン二つ)の事を「スコープ定義演算子」と言います。
スコープ定義演算子は、主に「静的(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」を見ておくと、少し面倒ではありますが、理解の一助になるかもしれません。
この記事が気に入ったらサポートをしてみませんか?