はじめに
こんにちは、しましまです。
今回は php でよく使用するスコープ定義演算子(::)について改めて調べてみました。
細かい部分までは知らなかったので、今回調べてわかったことをまとめていきます。
スコープ定義演算子の使い方
スコープ定義演算子(::)は、定数 static プロパティ、 クラスの static メソッドや親クラスの static メソッドにアクセスできます。
クラス定義の外から参照する際には、 クラスの名前を使用する必要があります。
クラス名と static による呼び出し確認
<?php
class MyClass {
const CONST_VALUE = "MyClass's value \n";
public static function message() {
return "MyClass's message function \n";
}
public static function innerOutput() {
echo MyClass::CONST_VALUE;
echo MyClass::message();
// クラスの内部なので、static による呼び出しが可能
echo static::CONST_VALUE;
echo static::message();
}
}
echo MyClass::CONST_VALUE;
echo MyClass::message();
echo "-------------------------\n";
MyClass::innerOutput();
// クラスの外部なので、static による呼び出しはエラーが発生
// echo static::CONST_VALUE;
// echo static::message();
/* 実行結果
MyClass's value
MyClass's message function
-------------------------
MyClass's value
MyClass's message function
MyClass's value
MyClass's message function
*/
?>
static キーワードについて
クラスプロパティやメソッドを static として宣言すると、クラスのインスタンスなしでも呼び出すことができます。
static として宣言されたプロパティやメソッドは、 インスタンス化されたオブジェクトの内部からも、前述した「スコープ定義演算子」 を使って呼び出すことができます。
static プロパティ
static プロパティはオブジェクト演算子 (->
) を使ってアクセスすることはできないため、注意が必要です。
static メソッド
static メソッドはオブジェクトのインスタンスなしで呼び出すことができるので、疑似変数 $this を使用して、 static として宣言されたメソッドの内部から利用することはできません。
static キーワードを用いた呼び出し確認
<?php
class MyClass {
public static $value = "MyClass's value \n";
public function message() {
return self::$value . MyClass::$value . $this::$value;
}
public static function staticMessage() {
// static メソッドのため $this は使えない
return self::$value . MyClass::$value;
}
}
echo "--------------------\n";
echo MyClass::$value;
echo MyClass::staticMessage();
$myClass = new MyClass();
echo "--------------------\n";
// オブジェクト演算子(->)で呼び出すことはできない
// echo $myClass->value;
echo $myClass::$value;
echo "--------------------\n";
// 内部メソッドの message を用いて呼び出し
echo $myClass->message();
echo "--------------------\n";
// static メソッドの呼び出し
echo $myClass->staticMessage();
/* 実行結果
--------------------
MyClass's value
MyClass's value
MyClass's value
--------------------
MyClass's value
--------------------
MyClass's value
MyClass's value
MyClass's value
--------------------
MyClass's value
MyClass's value
*/
?>
おわりに
static な要素の呼び出しについて曖昧な部分があったので、今回理解を深めることができました。
しかし「遅延静的束縛」といった単語が学習中に出てきましたが、まだ理解できていないので、
次は「遅延静的束縛」に関して調査を行う予定です。