PHPの「クラス」と「インスタンス」――「オブジェクト指向」の基礎中の基礎Web業界で働くためのPHP入門(13)(1/3 ページ)

オープンソースのWeb開発向けスクリプト言語「PHP」の文法を一から学ぶための入門連載。今回からしばらく、PHPの「オブジェクト指向言語」としての書き方を紹介します。今回は、その1回目として基礎中の基礎である「クラス」と「インスタンス」を扱います。

» 2017年12月14日 05時00分 公開

 オープンソースのWeb開発向けスクリプト言語「PHP」の文法を一から学ぶための入門連載「Web業界で働くためのPHP入門」。

 今回からしばらく、PHPの「オブジェクト指向言語」としての書き方を紹介します。今回は、その1回目として基礎中の基礎である「クラス」と「インスタンス」を扱います。

クラスとインスタンス

 JavaやRubyなど、最近主流で使われているプログラミング言語は、「オブジェクト指向言語」と呼ばれています。PHPは、バージョン5以降、本格的にオブジェクト指向としてのプログラミングが可能となりました。その、オブジェクト指向プログラミングの中心となる考え方が、クラスとインスタンスです。クラスとは何か、インスタンスとは何か、これらを意識しながら話を進めていくことにします。

処理の共通部分をまとめた関数の復習

 まず、復習からいきましょう。以下のcalcTestScore.phpを作成し、実行してください。

<?php
$taroName = "たろう";
$taroMath = 87;
$taroEnglish = 92;
$taroJapanese = 74;
$taroSum = $taroMath + $taroEnglish + $taroJapanese;
$taroAve = $taroSum / 3;
print($taroName."さんの合計: ".$taroSum." 平均: ".$taroAve."<br>");
 
$hanakoName = "はなこ";
$hanakoMath = 95;
$hanakoEnglish = 79;
$hanakoJapanese = 83;
$hanakoSum = $hanakoMath + $hanakoEnglish + $hanakoJapanese;
$hanakoAve = $hanakoSum / 3;
print($hanakoName."さんの合計: ".$hanakoSum." 平均: ".$hanakoAve."<br>");
リスト1 phplesson/chap13/calcTestScore.php

 実行結果は以下の通りです。

たろうさんの合計: 253 平均: 84.333333333333
はなこさんの合計: 257 平均: 85.666666666667

 これは、たろうさんとはなこさんの数英国の各教科の合計と平均を計算し、表示するプログラムです。特に難しい部分はありません。ただ、合計の計算、平均の計算、それらの表示という処理部分、つまり6〜8行目と14〜16行目がほぼ同じソースコードであり、無駄です。

 連載第9回『PHPの「関数」で処理を共通化して再利用する』で紹介したように、ほぼ同じソースコードの繰り返しが出る場合、それを関数として共通化します。そのように改良した以下のcalcTestScore2.phpを作成し、実行してください。

<?php
function printScore(string $name, int $math, int $english, int $japanese): void
{
    $sum = $math + $english + $japanese;
    $ave = $sum / 3;
    print($name."さんの合計: ".$sum." 平均: ".$ave."<br>");
}
 
$taroName = "たろう";
$taroMath = 87;
$taroEnglish = 92;
$taroJapanese = 74;
printScore($taroName, $taroMath, $taroEnglish,$taroJapanese);
 
$hanakoName = "はなこ";
$hanakoMath = 95;
$hanakoEnglish = 79;
$hanakoJapanese = 83;
printScore($hanakoName, $hanakoMath, $hanakoEnglish, $hanakoJapanese);
リスト2 phplesson/chap13/calcTestScore2.php

 実行結果はリスト1と同じです。

 合計の計算、平均の計算、それらの表示という処理部分を関数printScore()とし、実行部分では、その関数を利用しています。

変数をまとめてみる

 関数として処理を共通化したリスト2ですが、まだソースコード中に似たような行があります。それは、各変数を用意している9〜12行目と15〜18行目です。こちらはあくまで変数の用意ですので、処理ではなくデータです。処理は関数として共通化できますがデータはどうでしょうか。

 そこで少し考えます。

 ここで用意しているのは、たろうさんの名前と数英国の点数です。同様にはなこさんの名前と数英国の点数です。名前と数英国の点数というのはバラバラで存在するデータではなく、これらがワンセットとしてたろうさんのデータであり、はなこさんのデータです。ところが、リスト2ではバラバラの変数として記述されています。これらの変数をワンセットのカタマリとして記述できれば理想であり、そういった記述方法が用意されています。それが、クラスです(後述するようにクラスの役割はそれだけではありません)。

 クラスは別ファイルとして記述するのが一般的です。以下のTestScore.phpを作成してください。なお、このファイルは実行部分がありませんので、実行しても何も表示されません。

<?php
class TestScore
{
    public $name = "";
    public $math = 0;
    public $english = 0;
    public $japanese = 0;
}
リスト3 phplesson/chap13/TestScore.php

 これがクラスです。

 ワンセットとしたい変数を波かっこで囲みます。ここでは名前と数英国の点数です。その際、変数にはpublicを付けます。publicが何を意味するかは次回以降で解説する予定です。このようにして囲まれた波かっこに下記を付与します。

class クラス名


 クラスは、慣例的に以下の3点に従った記述方法を採ります。

  • クラス名はアルファベットの大文字で始めるキャメル記法(アッパーキャメル記法)で記述する。
  • クラスとファイルの対応関係は1対1とする。つまり、1つのクラスは1つのphpファイルに記述し、そのファイルにはそのクラス以外のコードは記述しない。
  • クラスを記述するphpファイルのファイル名は、「クラス名.php」とする。

)記法に関しては第3回の「キャメル記法とスネーク記法」を参照してください。

クラスを使ってみる

 リスト3で変数がクラスという形でまとまりました。次に、このクラスの使い方を解説します。リスト2をTestScoreクラスを使ったソースコードに変更した以下のuseTestScore.phpを作成し、実行してください。

<?php
require_once("TestScore.php");
 
function printScore(string $name, int $math, int $english, int $japanese): void
{
    $sum = $math + $english + $japanese;
    $ave = $sum / 3;
    print($name."さんの合計: ".$sum." 平均: ".$ave."<br>");
}
 
$taro = new TestScore();
$taro->name = "たろう";
$taro->math = 87;
$taro->english = 92;
$taro->japanese = 74;
printScore($taro->name, $taro->math, $taro->english,$taro->japanese);
 
$hanako = new TestScore();
$hanako->name = "はなこ";
$hanako->math = 95;
$hanako->english = 79;
$hanako->japanese = 83;
printScore($hanako->name, $hanako->math, $hanako->english, $hanako->japanese);
リスト4 phplesson/chap13/useTestScore.php

 実行結果はリスト1と同じです。

 関数printScore()はリスト2と同じものです。また、TestScoreクラスは外部ファイルに記述していますので、それを利用する場合は関数同様あらかじめそのファイルを読み込んでおく必要があります。それが2行目のrequire_once()です。

 さて、変わった部分を見ていきましょう。クラスを利用するには以下の手順を取ります。

・【1】クラスをnewしてそれを変数に格納する

 11行目や18行目が該当します。構文としては以下のようになります。

構文 クラスのnew

インスタンスを格納する変数 = new クラス名();


 詳細は後述しますが、この「クラス名()」の前にnewを記述することで生成されたものを「インスタンス」といいます。つまり、11行目や18行目はTestScoreクラスのインスタンスを生成するコードなのです。そして、$taroや$hanakoは生成されたインスタンスを格納した変数です。

・【2】インスタンス内の変数を利用するには「->」を記述する

 12〜16行目、19〜23行目の「$taro->name」のような記述が該当します。

 ここで注意したいのは「->」の次の変数名、つまりインスタンス内の変数には「$」は付かないということです。

 例えば、「$taro->name」で1つの変数のように扱うということです。そのため、この「$taro->name」に対して値を代入することもできますし、その値を利用することもできます。リスト4では12〜15行目、19〜22行目が値の代入を行っており、一方、16行目と23行目が格納された値を利用しています。つまり、インスタンス内の変数も、通常の変数と同様に扱えます。

 なお、この変数に代入したり変数の値を参照したりすることを、通常の変数同様に「アクセスする」という用語を使っていきます。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。