PHP オブジェクトのメソッド(method)
メソッド
メソッドの設定
メソッド は、オブジェクト に関連付いた関数のことです。オブジェクト自身に関する操作や振る舞いを行います。メソッド にも プロパティ 同様にアクセス権の設定があります。プロパティと同じで、キーワード public/private/protected で表現し、内容も同一です。public の場合は、クラス外からアクセス可能で、private/protected の場合、同クラス内や継承先クラスの メソッド を通してしか メソッド にアクセスできません。メソッド の場合、アクセス修飾子の省略が可能です。省略した場合、public となります。
※プロパティ 省略不可です。
- public:クラス外からメソッドにアクセス可
- private:同クラス内の メソッド から メソッド にアクセス可
- protected:同クラス内と継承先クラスの メソッド から メソッド にアクセス可
簡単な メソッド を定義してコールしてみましょう。 メソッド のアクセス権は public です。
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php //クラス定義 class greeting{ //メソッド定義 public function morning(){ echo"おはようございます!<br>\n"; } } //インスタンス化 $obj = new greeting; //メソッドコール $obj->morning(); ?> |
クラスの定義、インスタンス化、メソッドのコールとシンプルな形です。では、次の例では、private/protected のアクセス修飾子を指定した メッド を作成して、その特性を考えてみたいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | <?php //クラス宣言 class dvd_player{ //プロパティ 再生回数 private $viewCount = 0; //publicメソッド 増加 public function increase_cnt(){ $this->viewCount += 1; $this->cnt_change(); } //protectedメソッド 減少 protected function decrease_cnt(){ $this->viewCount -= 1; $this->cnt_change(); } //privateメソッド 変更実行 private function cnt_change(){ echo "再生回数は{$this->viewCount}回です。<br>\n"; } } //インスタンス化 $obj = new dvd_player; //メソッドコール $obj->increase_cnt(); //$obj->decrease_cnt();//エラー //$obj->cnt_change();//エラー //派生クラス class derivation_dvd_player extends dvd_player{ //メソッド減少 public function increase_cnt(){ $this->decrease_cnt(); } } //インスタンス化 $obj = new derivation_dvd_player; //メソッドコール $obj->increase_cnt(); ?> |
再生回数は-1回です。
dvd_player クラス を宣言し、再生回数の プロパティ private $viewCount を作成、この $viewCount の再生回数の増減を行う メソッド increase_cnt() と decrease_cnt() と cnt_change() を定義しています。そして、アクセス修飾子はそれぞれ、 increase_cnt() は public 、 decrease_cnt() は protected 、cnt_change() は private にしてあります。プロパティ $viewCount と、メソッド cnt_change() はアクセス修飾子が private なので、同クラス内の メソッド increase_cnt() と decrease_cnt() を通して操作可能です。メソッド increase_cnt() は、public なので、クラス外から直接アクセス可能で、インスタンス化 $obj = new dvd_player; して、$obj->increase_cnt(); コールすると「再生回数は1回です。」が出力されます。メソッド decrease_cnt() は protected なので、同じクラス内の メソッド か 継承先の メソッド を通してしかアクセスできません。ですので、 $obj->decrease_cnt(); と直接コールするとエラーになります。この例では、派生クラス derivation_dvd_player() を定義して、この クラス の public メソッド increase_cnt() を作成して、この メソッド を通して dvd_player クラス の decrease_cnt() メソッド にアクセスしています。
アクセサー
では プロパティ へのアクセスを メソッド を通して行うように変更し、そのための メソッド を作成しましょう。先程設定した プロパティ のアクセス権を private に変更してクラス外からアクセスできないようにします。ではどのようにアクセスするのかというと、メソッド を使用してアクセスするようにしてみます。プロパティ への値の設定も メソッド を利用してみましょう。$this は インスタンス 自身を示す特別な変数です。$this を使用すると クラス内 の プロパティ や メソッド にアクセスできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?php //クラス定義 class optical_drive{ //プロパティ private $maker; //set メソッド public function set_maker($name){ $this->maker = $name; } //get メソッド public function get_maker(){ return $this->maker; } } //インスタンス化 $obj = new optical_drive; //set メソッド $obj->set_maker('ASUS'); //get メソッド echo $obj->get_maker(); //echo $obj->maker; ?> |
set_maker() メソッド で プロパティ に値を設定し、 get_maker() メソッド で プロパティ を呼び出しています。
プロパティ に直接アクセスしようとすると echo $obj->maker; 次のようなエラーが発生します。「PHP Fatal error: Uncaught Error: Cannot access private property」private プロパティ にアクセスできません、という「Fatal error(重大なエラー)」というメッセージです。
では次に、クラス の プロパティ maker はメーカー名として扱いたいので set_makerメソッド は文字列で60文字以内あればセット可能という仕様に変更しましょう。配列やオブジェクトが makerプロパティ に設定されるのは想定外ですからね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <?php //エラーメッセージ function error_message($message){echo $message."<br>\n";} //クラス定義 class dvd_player{ //プロパティ private $maker; //set メソッド public function set_maker($name){ //文字列型で60文字以内 if('string' == gettype($name) && 60 >= mb_strlen($name, 'UTF-8')) $this->maker = $name; else return error_message('メーカー名は文字列で60文字以内にして下さい。'); } //get メソッド public function get_maker(){ return $this->maker; } } //インスタンス化 $obj = new dvd_player; //set メソッド $obj->set_maker(array(1,2,3)); ?> |
文字列型で60文字以内というフィルタを行っています。条件を満たさない場合は、エラーメッセージを返えします。
1 2 3 | if('string' == gettype($name) && 60 >= mb_strlen($name, 'UTF-8')) $this->maker = $name; else return error_message('メーカー名は文字列で60文字以内にして下さい。'); |
これは1つのカプセル化の例です。 プロパティ maker のアクセス権を private に指定し、外部から直接操作させないようにします。その上で、操作するための処理(メソッド)を別途作ります。操作するための メソッド は外部からアクセス可能である必要があるので、 public の設定です。このような実装を一般的に アクセサー(accessor) と呼び、カプセル化のデータ隠蔽という考えに当たります。
- クラス の プロパティ アクセス権を private にする
- プロパティ に値を設定するメソッドを setter()
- プロパティ から値を取得するメソッドを getter()
- 一般的に setter は「'set' + プロパティ名」、getterは「’get’ + プロパティ名」にする場合が多い
- setter/getter の アクセス権は、public または protected にする
- setter には、バリデート(validate)等のフィルタ処理をさせる場合がある
- プロパティ への操作はすべて アクセサー と通す
タグ(=記事関連ワード)
日付
最終更新日: