スコープ定義演算子 (::)
スコープ定義演算子 (またの名を Paamayim Nekudotayim)、 平たく言うと「ダブルコロン」は、トークンのひとつです。 static, 定数 およびオーバーライドされたクラスのプロパティやメソッドにアクセスすることができます。
これらの要素をクラス定義の外から参照する際には、 クラスの名前を使用してください。
PHP 5.3.0 以降では、変数を用いてクラスを参照することも可能です。
変数の値に (self
や parent
、
static
といった)
キーワードを指定することはできません。
なぜダブルコロンに Paamayim Nekudotayim という名前をつけたのか、 ちょっと奇妙に感じられるかもしれません。 しかし、Zend Engine 0.5 (PHP 3のエンジン) を 書いている時に、Zend チームはこう呼ぶと決めたのです。 この奇妙な名前は、実はダブルコロンを意味するヘブライ語なのです!
例1 クラス定義の外からの ::
<?phpclass MyClass { const CONST_VALUE = 'A constant value';}$classname = 'MyClass';echo $classname::CONST_VALUE; // PHP 5.3.0 以降で対応echo MyClass::CONST_VALUE;?>
三つの特別なキーワード self
と parent
そして static
がクラス定義の内部からプロパティまたはメソッドにアクセスする際に使用されます。
例2 クラス定義の中からの ::
<?phpclass OtherClass extends MyClass{ public static $my_static = 'static var'; public static function doubleColon() { echo parent::CONST_VALUE . "\n"; echo self::$my_static . "\n"; }}$classname = 'OtherClass';$classname::doubleColon(); // PHP 5.3.0 以降で対応OtherClass::doubleColon();?>
拡張されたクラスが親クラスのメソッドの定義をオーバーライドする際、 PHPは親クラスのメソッドをコールしません。 親クラスのメソッドをコールするかしないかは、 拡張されたクラスに責任があります。 これは、コンストラクタおよびデストラクタ, オーバーロード, そして マジック メソッドの定義にも 適用されます。
例3 親クラスのメソッドをコールする
<?phpclass MyClass{ protected function myFunc() { echo "MyClass::myFunc()\n"; }}class OtherClass extends MyClass{ // 親の定義をオーバーライドします public function myFunc() { // それでも親の関数をコールできます parent::myFunc(); echo "OtherClass::myFunc()\n"; }}$class = new OtherClass();$class->myFunc();?>
静的コールのトリックに関するサンプル も参照ください。