第5章 クラスメンバとインスタンスメンバ

5.2 クラスメンバの注意点

 クラスメンバを利用していくと、これまで学習してきた内容のが適応できない場合が出てきます。それについて説明を行っていきます。

5.2.1 クラスメンバ利用時の制約について

クラスメンバを利用するうえでの制約を以下に示します。
・クラス変数には「$this->」キーワードは使えない。
・クラスメソッドからインスタンスメンバへはアクセスできない。

凡例:クラス変数に「$this->」キーワードが使えない

 「$this->」キーワードは「オブジェクト自身の」という意味になります。クラスメンバはクラス自身に関連付けられており、オブジェクト自身のメンバには関連付けられない(オブジェクトの中で生成されていない)ため「$this->」キーワードをつけることができません。

凡例:クラス変数に「$this->」キーワードが使えない

 クラスメソッドはクラスに関連付けられた単一の存在ですが、インスタンスメンバはオブジェクト自身に関連付けられ生成される毎にその実体が存在することになります。ですのでクラスメソッドからでは、どのオブジェクトのインスタンメンバにアクセスしていいのか判断がつかないため呼び出すことができません。
 実際に凡例のように制約があることをサンプルで紹介します。

5.2.2 クラスメンバの制約確認サンプル

 クラスメンバの制約を確認するプログラムです。このプログラムは実行時エラーが発生する他、Eclipse上に警告が表示されます。

ソースコード

ソース・フォルダー  :myproj_framework_basic/ch05
ファイル名      :noAccsessFromClassMember.php
アクセスURL    :http://localhost/myproj_framework_basic/ch05/noAccsessFromClassMember.php

➢ noAccsessFromClassMember.php

	<?php
	// クラスの定義作成
	class Computer4{
		private $os;
		private $memory;
		public static $sum;
	
		// コンストラクタ
		public function __construct(){
			$this->os = null;
			$this->memory = 0;
			Computer4::$sum++;
 			echo "パソコンを作成しました。<br>";
		}
		public function setOsMemory($os, $memory){
 			$this->os = $os;
 			$this->memory = $memory;
 			echo "OSを「" . $os . "」に、メモリサイズを「" . $memory . "MByte」に変更しました。<br>";
		}
		public function show(){
 			echo "パソコンのOSは「" . $this->os . "」です。<br>";
 			echo "メモリサイズは「" . $this->memory . "MByte」です。<br>";
		}
		public static function showSum(){// クラスメソッド
 			echo "■パソコンは合計" . $this->sum . "台作成されています。<br>"; //クラス変数に$this->でアクセス
 			echo "■パソコンは合計" . $this->memory . "台作成されています。<br>"; //インスタンス変数にアクセス
 			$this->show(); // インスタンスメソッドへアクセス
		}
    }
    ?>
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title>クラスメンバの制約</title>
        </head>
        <body>
            <?php
                Computer4::$sum = 0; // クラス変数sumにアクセスし0で初期化
                Computer4::showSum(); // クラスメソッドshowSumにアクセス1回目
                
                $com1 = new Computer4();
                $com1->setOsMemory("WindowsXP", 2048);
                $com1->show();
                Computer4::showSum(); // クラスメソッドshowSumにアクセス2回目
                
                $com2 = new Computer4();
                $com2->setOsMemory("Windows2000", 512);
                $com2->show();
                Computer4::showSum(); // クラスメソッドshowSumにアクセス3回目
            ?>
        </body>
    </html>
	

実行結果
 以下の実行時エラーが表示されます。

Eclipse上でのソースファイル結果

解説
 3~29行目のComputer4クラス内の24~28行目のshowSum()メソッドの処理で、25行目ではクラス変数である$sumに「$this->」がついています。26行目ではインスタンス変数の$memoryにアクセスし、27行目ではインスタンスメソッドのshow()メソッドを呼び出しています。

 25行目のようにクラス変数sumに「this」をつけるとエラーになります。

 26、27行目のようにクラスメソッドから、インスタンスメンバにアクセスしてもエラーになります。

ポイント

・クラスメンバには以下の制約がある。
・クラスメンバに「$this->」キーワードは利用できない。
・クラスメソッドからインスタンスメンバへアクセスはできない。

インスタンスメンバとクラスメンバの使い分け
オブジェクト毎に異なる値を設定したいのであればインスタンスメンバ、全てのオブジェクト共通の値として使いたいならクラスメンバで、そのどちらかの目的に応じて使い分けます。


NEXT>> 5.3 本章のまとめ