「PHPで、どのようにオブジェクト指向プログラミングをしていくか」を解説する連載。初回は、「クラス」の書き方と簡単な使い方、メソッド/クラス定義内関数、プロパティ/クラス定義内変数、マルチプルインスタンスについて紹介します。
本連載では、数回にわたって「PHPで、どのようにオブジェクト指向プログラミングをしていくか」を解説します。比較的「多くのオブジェクト指向プログラミングで共通していえる話」から「幾分、PHPに固有のお話」まで、ゆっくりと綴っていきたいと思います。「唯一の正解」なんてものはなかなか存在しないものですが、「こんな考え方もあるのか」ぐらいの感じで読んでいただければ幸いです。
おおむね「PHPの基本文法は理解したけど、その次はどうしよう……」という人を読者に想定しています。例えば「初心者本を1、2冊読んで、ある程度手を動かしてみた」「PHP 5技術者認定初級試験には合格した」(あるいは「合格できるだろう」くらいには勉強をした)というレベルの人です。
そのようなレベルにある時期は、「で、オブジェクト指向っておいしいの?」などと疑問を持つ人も多いかと思います。そこで本連載では、オブジェクト指向プログラミングの「うまみ」ができるだけ分かりやすいよう、実務に沿って解説していければと思います。
セカンドターゲットは「他のプログラミング言語でOOP(Object-Oriented Programming:オブジェクト指向プログラミング)は分かるけど、PHPでのOOPは初めて」という人です。「OOPそのもの」の話ではPHPの書式を説明し、加えて「PHP固有の機能」もいくつか紹介していきますので、「こういう書き方ができるのか」「こんな機能があるのか」と楽しんでいただければと思います。
まずは簡単に、PHPという言語についておさらいをしておきましょう。
今はともかく、昔は「Personal Home Page Tools」の略称でした。「Personal」という部分については、現在PHPは大きな案件などにも使われているため大変微妙ですが、「Home Page Tools」という部分は今でも色濃く残っていると思います。具体的には、Webアプリケーション(昔は「CGI:Common Gateway Interface」と言いました)を組むのに大変に便利なプログラミング言語です。
「どこまで機能がそろっていたら『オブジェクト指向プログラミング言語』といえるのか?」という定義にもよるとは思いますが、PHP 5になってからは、ある程度オブジェクト指向言語としての機能も充実してきました。他言語と比較しても、「オブジェクト指向プログラミング」を行うのに、さほど困ることのない状況になってきたのではないか、と思います。
何はともあれ、クラスの書き方および構成要素の基本を、おさらい程度にですが学んでいきましょう。恐らく、読者の皆さんにとっては「ある程度、何となくは見覚えがある」くらいの感じだとは思うのですが。不安な方は、お手持ちの参考書や初心者本をあらためて確認してみるのもよいでしょう。
クラスは、ものすごく大ざっぱに言うと「変数と関数の塊」です。疑似的にコードっぽいものを書くと、以下のようになります。
class クラス名 {
function 関数名1() { 処理; }
function 関数名2() { 処理; }
//
$変数名1;
$変数名2;
}
実際には「誰がその関数や変数にアクセスできるか?」を意味する「アクセス権(またはアクセス修飾子)」と呼ばれる、端的には「誰がその関数や変数にアクセスできるか?」を指定するので、以下のようになります。
class クラス名 {
public function 関数名1() { 処理; }
public function 関数名2() { 処理; }
//
private $変数名1;
private $変数名2;
}
実際には、アクセス権は複数あるのですが、その辺りは次回、詳しく説明しますので、今は一端「関数はpublicで、変数はprivateを足して書くのか」ぐらいに思っていてください。
次の話をする前に、いくつか用語を整理していきましょう。上述した通り、まずは「クラス」を宣言します。「クラスを定義する」という言い方もあり、理解の段階では、これはとても分かりやすい語彙かと思いますので、できるだけ「クラスを定義する」「クラス定義」という単語を、本稿では使っていきます。
クラス定義の中には、前述した通り「変数と関数」があります(実際には「定数」もありますがいったん置いておきます)。通常クラス定義内に書かれている関数のことを「メソッド(method)」、クラス定義内に書かれている変数のことを「プロパティ(property)」と呼びます。
「クラス内変数」「クラス内関数」でも通じますが、多くの文章では「メソッド」「プロパティ」と書かれているので、覚えておくといいでしょう。
クラスは「クラス定義を書いた」だけでは使えず、その後で、「new」という演算子を使って「インスタンス」と呼ばれるものを作る必要があります(例外もありますが、それは後ほど)。「インスタンス」は変数で保持可能な値の一つで、PHPでは「オブジェクト型」という型を持つ値です。
実際に、インスタンスを作成して、var_dumpで表示をしてみましょう。
<?php // クラス定義 class hoge { // メソッドの宣言 public function hogeMethod(){} // プロパティの宣言 private $_hogePropaty; } // $obj = new hoge(); var_dump($obj);
「インスタンス」のことを「オブジェクト」と呼称することも多いですが、「オブジェクト」という単語は割と意味合いが広いので、本稿では基本的に、new演算子によって作られた「オブジェクト型の値」のことを「インスタンス」と呼称します。
普段プログラムで使うのは、先ほど説明した「インスタンス」ですが、このインスタンスについて、もう少し確認してみましょう。先に結論を書くと、インスタンスは「クラス定義によって記述された、一塊のデータ」であるといえます。
まず、前提になるクラス定義を書いてきます。また、併せてインスタンスを一つ作り、そのインスタンスに値を入れてから、var_dumpで確認します。
<?php // クラス定義 class hoge { // メソッドの宣言 public function setValue($i){ // 引数の値をプロパティに保存する $this->_value = $i; } // プロパティの宣言 private $_value; } // $obj = new hoge(); $obj->setValue(10); var_dump($obj);
$this->、を使ってプロパティに値を入れたり出したりするのは、初心者向けコンテンツで確認してください。ちなみに、他言語ですと省略可能なものもありますが、PHPでは「明示的な記述が必須」です。
このコードで表しているのはとても簡単で「プロパティ $_value に対して、整数10を代入している」ということです。
では、値を2回、setValueしてみましょう。
<?php // クラス定義 class hoge { // メソッドの宣言 public function setValue($i){ // 引数の値をプロパティに保存する $this->_value = $i; } // プロパティの宣言 private $_value; } // $obj = new hoge(); $obj->setValue(10); var_dump($obj); $obj->setValue(20); var_dump($obj);
当たり前ではありますが、上書きされるので2回目のvar_dumpでは「int(20)」が出力されてきます。
それでは「別のインスタンスの値を書き換えた」ら、どうなるでしょうか。実際にコードを書いてみましょう。
<?php // クラス定義 class hoge { // メソッドの宣言 public function setValue($i){ // 引数の値をプロパティに保存する $this->_value = $i; } // プロパティの宣言 private $_value; } // $obj = new hoge(); $obj->setValue(10); var_dump($obj); // $obj2 = new hoge(); $obj2->setValue(20); var_dump($obj); var_dump($obj2);
これを「不思議」ととらえる人も「当たり前」ととらえる人もいるかと思いますが、「$obj2」に対する変更は、「$obj」には全く反映されません。
このように、各インスタンスは完全に「独立した」値として扱われます。「マルチプルインスタンス」なんていう言い方もありますが、これはオブジェクト指向プログラミングにとって「とても」重要な部分なので、しっかりと押さえておきましょう。
今回は、オブジェクト指向プログラミングの最も基本的な部分について見てきました。この辺りは他のプログラミング言語のOOPでもほぼ「同じ」ところですね。取りあえずは「クラス定義」「インスタンス」、余裕があったら「マルチプルインスタンス」までを押さえていただければ、先に進むのが楽になるかと思います。
次回も「他言語でも通用するOOPの話」です。具体的には「カプセル化」「アクセサー」「アクセス修飾子」「イミュータブルなオブジェクト」「コンストラクター」「デストラクター」などについて説明します。次回をお楽しみに。
Copyright © ITmedia, Inc. All Rights Reserved.