PHP static,スコープ,selfについて 【初級編 第46回】

この記事は2013年1月18日に書かれたものです。内容が古い可能性がありますのでご注意ください。


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(); エラーになる

?>

結果は以下のようになります。
ブラウザ確認画像

今回はここまでにします。

  • このエントリーをはてなブックマークに追加

PAGE TOP