Tips

2013.08.29

PHP 静的なメンバ変数やメンバメソッドへのアクセス 【初級編 第54回】

PHP

クラス

今回も前回に引き続いてクラスについて記載していきたいと思います。

クラス内の静的なメソッドへのアクセスについて

以前にもクラス内の静的なメソッドへのアクセスについて記述しましたが、
今回も再度クラス内のメソッドなどへのアクセス方法について記述していきたいと思います。

単純な静的メンバ変数や静的メンバメソッドの呼び出し

以下のようにするとオブジェクトを作成しなくても
クラス内のメンバ変数やメンバメソッドにアクセスすることができます。

クラス内のメンバ変数やメンバメソッドにアクセスする方法の1つに以下のようにしてアクセスる方法があります。
クラス名::$メンバ変数名
クラス名::メンバメソッド名

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
 
    class class01{
        public static $var = "111<br>";   //staticの記述を抜くとエラーになります。
        public static function func01(){  //staticの記述を抜くと警告になります。
            echo "class01内のfunc01<br>";
        }
    }
 
    echo class01::$var;
    class01::func01();
 
?>

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

オブジェクトを作成した上での呼び出し

以下のようにしてアクセスする場合は static の記述は入れません。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
 
    class class01{
        public $var = "111<br>";   //staticの記述を入れるとエラーになります。
        public function func01(){  //staticの記述を入れると警告になります。
            echo "class01内のfunc01<br>";
        }
    }
 
    $obj = new class01();
    echo $obj->var;
    $obj->func01();
 
?>

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

静的なメンバ変数の値の変更

また静的なメンバ変数は以下のように値をちゃんと変えることができます。
クラス内でも 「クラス名::メンバ変数名やメンバメソッド名」のようにすれば静的にアクセスができます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
 
    class class01{
        public static $var = "111<br>";
        public static function func01(){
            class01::$var = "333<br>";
        }
    }
 
    echo class01::$var;
    class01::$var = "222<br>";
    echo class01::$var;
    class01::func01();
    echo class01::$var;
 
?>

結果は以下のようになります。

ブラウザ確認画像

static 宣言していないメンバ変数やメンバメソッドへの静的なアクセス

以下のようにして static宣言していないメンバ変数やメンバメソッドにアクセスしようとするとエラーになる。

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
 
    class class01{
        public $var = "111<br>";
        public function func01(){
            echo "class01内のfunc01<br>";
        }
    }
 
    echo class01::$var;
    class01::func01();
 
?>

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

これらのことから以下のようなことがわかります。
・static を用いてメンバ変数やメンバメソッドを宣言した場合は、オブジェクトとは別のメモリ上に確保され、いろいろな場所から共有されることになる。
・static を用いてメンバ変数やメンバメソッドを宣言した場合は、オブジェクトで扱うことはできない。

static 宣言していないメンバ変数へのクラス内での静的なアクセス

たとえクラス内から「クラス名::メンバ変数名」のようにアクセスしてもエラーになりアクセスできません。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
 
    class class01{
        public $var = "111<br>";
        public function func01(){
            class01::$var = "222<br>";
        }
    }
 
    $obj = new class01();
    echo $obj->var;
    $obj->func01();
    echo $obj->var;
 
?>

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

static 宣言していないメンバ変数に対してオブジェクト経由でアクセスする場合

static宣言していないメンバ変数の値を変更したいならオブジェクトを作成して、
「$this->メンバ変数名」のようにしてアクセスする必要があります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
    class class01{
        public $var = "111<br>";
        public function func01(){
            $this->var = "222<br>";
        }
    }
 
    $obj = new class01();
    echo $obj->var;
    $obj->func01();
    echo $obj->var;
 
?>

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

static宣言しているメンバ変数に対してオブジェクト経由でアクセスした場合

static 宣言しているメンバ変数に対して $this を使用して値を書き換えようとすると
やっぱり同じようにエラーになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
 
    class class01{
        public static $var = "111<br>";
        public static function func01(){
            $this->var = "222<br>";
        }
    }
 
    echo class01::$var;
    class01::func01();
    echo class01::$var;
 
?>

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

static宣言しているメンバ変数に対してオブジェクト経由でアクセスして値を変える場合

しかし以下のようにすれば static 宣言しているメンバ変数もオブジェクト経由で値を変えることができます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
 
    class class01{
        public static $var = 10;
        public function func01(){
            class01::$var = class01::$var + 10;
        }
    }
 
    $obj = new class01();
    echo class01::$var."<br>";
    $obj->func01();
    echo class01::$var."<br>";
 
?>

結果は以下のようになります。
ブラウザ確認画像
[styled_images width=”300″ height=”250″] [image title=”ブラウザ確認画像”]https://techpjin.sakura.ne.jp/techpjin_new/wp-content/uploads/2013/08/class_static8.png[/image] [/styled_images] [clearboth]

これらのことから以下のようなことがわかります。
・static宣言したメンバ変数やメンバメソッドに対しては、::(スコープ演算子)を使った静的なアクセスをする必要がある。
・static宣言していないメンバ変数やメンバメソッドに対しては、$this を使ってアクセスをする必要がある。
・static宣言したメンバ変数などもオブジェクト経由で静的にアクセスすれば値を変えることができる。


今回はここまでで次回からもクラスについて記載していきたいと思います。

新連載はじまりました!新PHP基礎 連載リンク

PHP基礎 連載

Recent News

Recent Tips

Tag Search