PHP static,スコープ,self
クラス
前回に引き続き今回もクラスについて記述していきたいと思います。
クラスへの静的なアクセス
通常クラス内のプロパティやメソッドを参照する場合にはインスタンス化してオブジェクトにしてからアクセスしますが、
クラス内のプロパティや関数にインスタンス化せずにアクセスする方法もあります。
クラス内のメンバへの静的なアクセス方法
static宣言とスコープ定義演算子というものを使用するとインスタンス化してオブジェクトにしなくてもクラス内のプロパティを参照することができます。
具体的には以下のように記述します。
class クラス名{
static public プロパティ名;
}
echo クラス名::プロパティ名;
このようにアクセスしたいプロパティやメソッドを static を付けて宣言し、
クラス外から :: でアクセスします。
:: はスコープ定義演算子などとよばれています。
以下ではクラス内に定義したプロパティにインスタンス化せずに静的にアクセスしています。
static宣言を抜いてしまうとエラーになり表示できませんでした。
<?php
class test{
public $atai1 = "通常のプロパティ";
static public $atai2 = "スタティック宣言したプロパティ";
}
echo "--- スコープ定義演算子を使用してアクセスする ---<br>";
// echo test::$atai1; エラーになる
echo test::$atai2."<br>";
echo "--- インスタンス化してアクセスする ---<br>";
$obj = new test;
echo $obj->atai1."<br>";
echo $obj->atai2."<br>";
?>
結果は以下のようになります。

また同じようにクラス内のメソッドにもアクセスすることができます。
メソッドの場合は static 宣言をしていないメソッドを :: で参照してもエラーになりませんでした。
<?php
class test{
public function func1(){
echo "通常のメソッド<br>";
}
static public function func2(){
echo "スタティック宣言したメソッド<br>";
}
}
echo "--- スコープ定義演算子を使用してアクセスする ---<br>";
test::func1();
test::func2();
echo "--- インスタンス化してアクセスする ---<br>";
$obj = new test;
$obj->func1();
$obj->func2();
?>
self
self文を使用すると、クラス内のメソッドにスコープ演算子を使用して参照した際に
自分自身のプロパティを参照させることができます。
これはオブジェクト化されたプロパティとは異なるものになります。
<?php
class test{
public $atai1 = "通常のプロパティ<br>";
static public $atai2 = "スタティック宣言したプロパティ<br>";
public function func1(){
// echo self::$atai1; エラーになる
echo "通常のメソッド<br>";
}
static public function func2(){
echo self::$atai2;
echo "スタティック宣言したメソッド<br>";
}
}
echo "--- スコープ定義演算子を使用してアクセスする ---<br>";
// test::func1(); エラーになる
test::func2();
echo "--- インスタンス化してアクセスする ---<br>";
$obj = new test;
$obj->func1();
// $obj->func2(); エラーになる
?>
今回はここまでにします。
