PHPにおけるオブジェクト指向とは?クラスやインスタンスについても解説!
PHPを使って高度なアプリなどを構築していく場合にはクラスを使うことになるでしょう。そしてこの場合、インスタンスやメソッド、プロパティといったものを理解しておかなければなりません。 ここではまず、オブジェクト指向とは何かということを説明、クラスなどの具体的な使い方についても解説していきます。
オブジェクト指向はPHPに限らないプログラミングの手法
オブジェクト指向とはプログラムを機能ごとにまとめて作成していくことを言い、この手法でプログラミングを行うのはPHPに限りません。
そもそもPHPはオブジェクト指向プログラミング言語として作られたわけではなく、標準機能の多くは関数として定義されていました。しかしオブジェクト指向プログラミングをするための機能も増え、現在ではクラスが広く利用されるようになっています。
そしてオブジェクト指向を学ぶ上ではポリモーフィズムやカプセル化について知っておくことも重要になります。ポリモーフィズムは同じメソッドの呼び出しでもオブジェクトによってその振る舞いが変わることを意味し、仕様変更の際に関数を直接編集せず、使用するオブジェクトを変えるだけでよくなるという利点があります。
カプセル化についても保守性が向上するという利点がありますが、こちらはプログラムを部分的に隠すということを行います。勝手に変数を変えられないようにすることや、外部から見たクラスの単純化などに効果があります。オブジェクト指向について詳しく理解することで管理のしやすいプログラムが作れるようになります。
まずは基本から押さえていきましょう。
オブジェクト指向で最低限知っておきたいこと
PHPにおけるオブジェクト指向ではクラス・インスタンスなどの理解が必須です。さらにその定義の方法や、クラスの継承についても知っておきましょう。
クラスは変数と関数でできた共通機能の集まり
オブジェクト指向プログラミングはクラスを作成することから始まります。まずはクラスが何者なのか理解するようにしましょう。
かんたんにクラスというものを説明すると、これは変数と関数の集合体であり共通機能をまとめたもの、と言うことができます。そのためよく使う機能をクラスとしてまとめておけば、プログラム全体としての記述が効率的になり、さらに管理面においてもメリットが得られます。
クラスの定義方法を見ていきましょう。
最初に「class」と記述してこれからクラスを定義することの宣言をします。
そしてその後ろにクラス名を記述、波括弧でブロックを作ります。定義したクラスに機能を持たせるにはこの波括弧内にプログラムを記述していきます。
class ClassName{
//機能を実装していく。
}
基本的にクラス名は任意ですが、定義済みのクラスなどがあれば衝突してしまうため注意しましょう。
このほかクラス名は単語ごとに頭文字を大文字にするというスタイルが一般的とされています。必ずこれに従う必要はありませんが、視認性を上げるためにもできるだけ共通させておくほうが望ましいでしょう。
インスタンスはクラスを個別具体的に実体化したもの
定義したクラスを使っていくにはインスタンス化させる必要があります。
これは実体化させる、などと表現されることもありますが、クラスという設計図をもとにインスタンスという実物を建築するというイメージを持つと良いでしょう。
設計図を使って実際に物を作ることにより、何かしらの機能性を持たせるのです。
インスタンスを生成する方法もごく簡単です。new演算子を用いて変数に格納するだけです。
$変数名 = new クラス名();
ちなみにこの変数はインスタンス化されたクラスの参照をしています。
そのためこの変数をさらに別の変数へ代入しても複製は行われず、同じインスタンスを参照するコピーの作成を意味します。つまりコピーした変数に変更を加えると、コピー元でもその変更の影響を受けていることになります。
これを防ぐにはcloneキーワードを使って複製をする必要があります。
$変数2 = $変数1 :コピー
$変数2 = clone $変数1 :複製
継承はクラスをコピーして拡張すること
クラスの継承とは、すでに定義済みのクラスをコピーし、そのクラスが持つ機能を引き継いで新しくクラスを定義することを言います。extendsキーワードのうしろに継承するクラスを指定、下のような形になります。
class 新クラス extends 親クラス{
//追加機能を記述していく。
}
継承はただクラスのコピーをするだけでなく、新しく定義したクラスに独自のプロパティやメソッドを追加することもできます。
オブジェクト指向とそうでないプログラムの比較
実はクラスを使うことで必ずしも利便性が上がるとも限りません。
ごく単純な処理であればわざわざクラスを定義する必要はありません。複雑な処理をさせたり、計算を多くさせたりする場合だとオブジェクト指向でプログラムを組んだ方が良い場面が多くなります。
例えばBMIを計算するプログラムは下のように記述ができます。
class Bmi
{
public $height;
public $weight;
public function calBmi(){
return ($this->weight / ($this->height / 100 * $this->height / 100));
}
}
$bmi = new Bmi();
$bmi->height = 170;
$bmi->weight = 60;
echo $bmi->calBmi();
これをオブジェクト指向ではない方法で記述してみます。
function calBmi($weight, $height){
return ($weight / ($height / 100 * $height / 100));
}
$bmiHeight = 170;
$bmiWeight = 60;
echo calBmi($bmiWeight, $bmiHeight);
この場合はそれほど複雑な処理ではないためオブジェクト指向であるほうが記述量は増えています。
しかしオブジェクト指向によるプログラムのほうは、引数の順番が原因で計算ミスが起こることはないというメリットがあります。
より複雑で引数の多い場合、オブジェクト指向の恩恵がより受けられるようになります。
機能の変更が楽になる!
このほか、データを羅列して表示させている場合などには値の変更があるとそれぞれの数値を書き換えていかなければなりませんが、オブジェクト指向で記述しておくとひとまとまりの大きな機能でも素早く変更ができるようになります。
ある機能の変更を加えたいといった場合でも、オブジェクト指向に従ってクラスで共通機能をまとめていると管理をしやすくなります。
まとめ
オブジェクト指向によるプログラミングでは、プログラムの保守・管理が行いやすくなります。ひとまとまりの機能をクラスとして定義しておけば、内容に変更が生じた際にもすぐに修正することができ、そのときの間違いも起こりにくくなります。
PHPで扱う場合、具体的にはクラスを定義し、その中で特定の処理を行うよう記述、そしてインスタンス化をする必要があります。クラスの継承をすれば共通の機能を保ちつつちょっとした変更も追加した別のクラスを作ることもできます。PHPをマスターするためにもオブジェクト指向を理解し、クラスを使いこなしていきましょう。
この記事のキーワードに関する勉強会・イベントを探す
TECH PLAYでは、ITエンジニア向けの勉強会・イベント情報を提供しています。
興味のある方はぜひご参加ください。