ページ)オープンソースのWeb開発向けスクリプト言語「PHP」の文法を一から学ぶための入門連載。今回は、オブジェクト指向言語の三大特徴の1つであるポリモーフィズムについて、抽象クラスとインタフェースを使って解説します。無名クラス次回はトレイトについて今回のサンプルコードオープンソースのWeb開発向けスクリプト言語「PHP」の文法を一から学ぶための入門連載「Web業界で働くためのPHP入門」。今回はオブジェクト指向言語の三大特徴の1つであるポリモーフィズムについて、抽象クラスとインタフェースを使って解説します。抽象クラス抽象クラスとは、抽象メソッドを含むクラスのことです。抽象メソッドとは処理の書かれていないメソッドのことです。この説明だけではピンとこないと思いますので、具体例で見ていくことにしましょう。前回、Animalクラスを作成し、それを継承したクラスとしてDogクラスを作成しました。そのDogクラスには鳴き声を表すcall()メソッドを実装しました。同様の方法でCatやPigなどのクラスを作成できます。その際、CatにもPigにも必ず鳴き声を表すcall()メソッドを実装してほしいとします。前回作成したAnimalクラスのままだと、設計書など何かドキュメントに記述するしか方法はありません。その記述を読み損ねたり読んでいても忘れたりしていると、各子クラスにcall()メソッドの実装忘れが起き、確実にバグとして混入されてきます。これは、以下のようにあらかじめAnimalクラスに空のメソッドを記述しておくことで致命的なエラーを避けることはできます。{}}あるいは、このcall()内に何か処理を記述しておき、それをデフォルトの動作としておくことも可能です。この方法には無理があります。いうのは、動物を表すAnimalの鳴き声というのが定まらない以上、call()の処理内容も決まりません。ここでは例えのように「鳴き声」使っていますが、実際の業務システムのクラス設計において、親クラスでは処理内容が決まらないというケースはあります。処理が書かれていないメソッドそこで、登場するのが抽象メソッドです。上述のように、抽象メソッドは処理内容が書かれていないメソッドです。サンプルで見ていくことにしましょう。以下のAbstractAnimalクラスを作成してください。//鳴き声を得るメソッド。phplesson/chap18/AbstractAnimal.phpクラス宣言部分の(1)と(2)の行以外は前回のAnimalクラスと同じです。ここで注目するのは(2)です。(2)では以下のように明らかにメソッドのような記述となっています。stringメソッド名と引数の有無、戻り値の型といったメソッド定義(これを「メソッドシグネチャ」といいます)は確認できます。メソッドにあるはずの{}(波かっこ)がありません。処理が記述されていないのです。このように、メソッドシグネチャだけで処理が記述されていないメソッドのことを「抽象メソッド」といい、メソッドシグネチャの先頭に必ず「abstract」を付けるのが約束事です。抽象メソッドを含むクラスのことを「抽象クラス」といい、こちらもクラス定義の先頭に必ず「abstract」を付けるのがお約束事です。リスト1の(1)がその記述です。抽象クラスのクラス名は、AbstractAnimalのように、通常「Abstract〜」とします。抽象メソッドは子クラスで必ず実装この抽象メソッド(抽象クラス)を利用する利点は、そのクラスを継承した子クラスでは、必ず抽象メソッドをオーバーライドする必要がある、ということです。そこを確認してみましょう。AbstractAnimalを正常に継承した子クラスとしてDogクラスを作成します。phplesson/chap18/Dog.php(1)の親クラスがAbstractAnimalになっていること以外は、前回作成したDogクラスと同じです。次に、同じくAbstractAnimalを継承した子クラスとしてCatクラスを作成しますが、あえて何も記述しないでおきます。phplesson/chap18/Cat.phpこのCatクラスに何も記述がないということは、当然call()メソッドもオーバーライドされていません。この2クラスを利用する実行phpファイルとして以下のcallAnimals.phpを作成し、実行してください。(3)〜(5)はコメントアウトのまま実行してください。phplesson/chap18/callAnimals.php実行結果は以下の通りです。鳴き声はわんわん(3)〜(5)のコメントアウト部分を除けば、ほとんど前回作成したcallDog.phpと同じコードです。違うのは(1)のファイルの読み込み部分がAbstractAnimalになっているところだけです((2)は同じコードです)。このように、抽象メソッドをちゃんと実装した子クラスを利用する限りは問題なく動作します。抽象メソッドを実装し忘れるとエラーとなる問題となるのは、抽象メソッドが実装されていないクラスを利用する場合です。ここではCatクラスが該当します。(3)でそのCatクラスファイルを読み込んでいます。本来、このようなrequire処理はファイル上部にまとめるのですが、ここは説明の都合上、(3)の位置に記述しています。(4)でCatクラスをnewしています。この2行のコメントアウトを元に戻して再度実行してみてください。実行結果は以下のようにエラーとなります。2エラーメッセージは、まさに、抽象メソッドの実装し忘れというものです。ここで注目したいのは、(4)をコメントアウトしても同じエラーとなることです。抽象メソッドを実装し忘れたクラスは、その定義そのものを読み込んだ時点でエラーとなるのです。(3)のrequire処理を従来通りファイル上部で記述していたならば、いち早く実装し忘れに気付けます。抽象クラスはnewできない抽象クラスの最後に、(5)を説明しておきましょう。ここでは、抽象クラスであるAbstractAnimalをnewしています。この1行のコメントアウトを元に戻して実行してみてください(その際、(3)と(4)はコメントアウトしておきましょう)。以下のようなエラーとなります。11エラーメッセージから分かるように、抽象クラスのインスタンスは作成できません。抽象クラスはnewしてはいけないのです。そもそも、処理内容が書かれていないのが抽象メソッドでしたので、newできないのはすぐに理解できるでしょう。インタフェース、ポリモーフィズム、無名クラス関連記事WordPress活用に欠かせない、PHPをWindowsにダウンロードしてインストール、アンインストールする本連載では、さまざまなソフトウェアのインストール、実行するためのセットアップ設定、実行確認、アンインストールの手順を解説する。今回は、PHPとは何か、PHPで動くツールの紹介、PHPのインストールとアンインストールについて解説。PHPプログラミングを始める参考にしてほしい。PHPにおけるクラスの書き方と呼び出し方——インスタンス、メソッド、プロパティ「PHPで、どのようにオブジェクト指向プログラミングをしていくか」を解説する連載。初回は、「クラス」の書き方と簡単な使い方、メソッド/クラス定義内関数、プロパティ/クラス定義内変数、マルチプルインスタンスについて紹介します。PHP(スクリプト言語)PHPは、HTMLへの埋め込みが可能なスクリプト言語(およびその処理系)。主としてWebアプリ開発に使用される。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。