【オブジェクト指向1】クラスの作成
おさらい
プログラムは機能をまとめてこそ効率的だ。
むしろそれができるから複数の処理を効率的に回転させ、かつ仕様変更があった際も最小限の改修でよいように組むことができる。
これまでにも以下のように情報や処理を管理してきた。
■データ管理(変数)
同じデータを色々な箇所で使いたい ➡変数に代入
増えてきたデータを1箇所にまとめてそこから出し入れしたい ➡配列
さらにそのデータ1つ1つにわかりやすくラベリングしたい ➡連想配列
■処理管理(関数)
この動きを他の箇所でも流用したい ➡関数
この「変数」と「関数」をパッケージ化したものがオブジェクトである。
そう、ついに機能ごとまとめてしまうのだ!!
もう一度言う、「変数」と「関数」をパッケージ化したものがオブジェクト!!
なぜ必要か
例えば、ショッピングサイトなど「商品情報を処理する機能」「購入情報を処理する機能」「売上管理を処理する機能」「ユーザーデータを管理する機能」など
〇〇機能が沢山出てくる。それを、オブジェクトを使わないと何が起こるか。
商品情報を処理するには、商品情報が変数に入って…、税込み価格を関数で処理して…とかなりシンプルに書いたが、この2つのデータと処理がどこのカテゴリにも属さず、野ざらし状態であるとする。
他にもこの野原には購入情報を処理する機能の変数や関数がごろごろいるとする。
たまたま、商品情報の変数を修正したつもりが購入情報を処理する機能の変数に何か代入してしまった!
新しく作った変数が実は存在していてごっちゃになった!
など、保守管理面でリスクが高い。
それだけではなく、商品が10000個あるとする。何か修正する際に1つづつ修正するのは時間がかかるしなにより、どこかでバグがあればそれこそわからなくなる。
10000個あるけど機能はここ1回しか書いていない!!!
となればすごく楽!!
また、ある処理までは一緒だけど、途中から片方は別の処理を挟まないといけなくなってしまった!めんどくさいけど、似たような関数をもう一度作るなど手間もかかりカオス状態になるのだ。
そうならないために、オブジェクトごとに外部から干渉されないよう機能ごとに区分けしておくことが便利で後々自分を助けることになるということだ!!
作り方
ここまでくればもうわかると思うがレシピは2つ、「変数」と「関数」。
そしてオブジェクトのベースとなる設計図を描く必要がある。
設計図のことをクラス(共通の性質を有する部類という意味)と呼ぶ。
今回は、ゲームのキャラクター情報やキャラクターに関する動きの処理をまとめたclassを作るよ。
①クラスを宣言
<?php class Player {} ?>
②変数を定義
そのクラス内で活躍する登場人物(データ)たちである。
例えば、ぱっと思いつくだけでも、名前/性別/年齢/職業/国籍などキャラクターを形成するデータが思いつく。
当然、これらのデータを使って今後キャラクターを育てていく。
結婚して名前が変わるかも、毎年年齢が増えるかも、転職するかも、など情報の種類は変わらないけど、更新されるし、人それぞれ違うので、変数として用意してあげよう。
<?php class Player { public $name; public $sex; public $year; public $job; public $nation; } ?>
【ここPOINT】
ちなみに、なぜ必要かセクションでも記述したが他のプログラム書いてるとき変数上書きされてたらやばくね?
ということでclass内で定義した変数は、所得できる範囲が限られている。
同じ村だけど、うっかり勝手に人の家のこどもの名前変えたり、家具の材質変えちゃた(笑)
おいー!ってことにならないようにこのclassのためだけの変数ちゃんたちです。
②メソッドを定義
メソッドって?もう一つのレシピは関数でしょ?、そうメソッドとは関数のことである。
変数の時と同様で、このclassのためだけの関数のことを”メソッド”と呼ぶよ。
つまりclass内で記述したメソッドは他の全く違うところからは呼び出せないよ!
そしてclass内メソッドだけ、class内の変数を使うことができるよ!
(メソッド「この変数たちを使えるのは俺だけだぜ!」)
それでは、その変数たちを使って挨拶するメソッドを作るよ。
<?php class Player { public $name; public $sex; public $year; public $job; public $nation; public function confirm(){ echo "私の名前は" . $this->name . "です。<br /> 職業は" . $this->job . "で" . $this->year . "歳の" . $this->nation . "です。"; } } ?>
これで、2つのレシピによってPlayerクラスが完成!!
次は、【オブジェクト指向2】インスタンスの生成で、このclass機能を使う(複製)する方法と複製するうえでのclassの手直し方法を紹介します!