PHPには標準ライブラリもしくはユーザ定義ライブラリが数多くあります。しかし、クラスはライブラリのようにあらかじめ第三者が用意してくれているものを利用するだけではありません。
共通のロジックを自分でクラスとして定義することで、より読みやすく、修正も行いやすいコードを記述することができます。
クラスの定義
オブジェクト指向プログラミングというとカプセル化や、ポリモーフィズム、継承などのキーワードを思い浮かべる方がいるでしょう。ですが、当記事では、具体的なクラスの定義を行い、解説していきます。
簡単なクラス
まずは構文的に簡単なクラスを定義してみましょう。
1 2 3 4 5 |
//Fruit.php <?php class Fruit{ } ?> |
一旦これだけでOKです。なお、クラス名に関しては最初の一文字は慣例的に大文字の方が良いでしょう。パスカル記法と言います。
これが正しいクラスであることを証明するためにnew演算子でFruitクラスをインスタンス化してみましょう。
1 2 3 4 5 6 |
//simple.php <?php require_once'Fruit.php'; $f = new Fruit(); ?> |
プロパティ
インスタンス化できたといっても、実質的にクラスの必要がありません。ここからクラスという器の中に様々なメンバ(要素)を追加していきます。
まずは、プロパティです。
プロパティとは、クラスの中で定義された変数のことです。ただ、classブロックの中で定義すればよいという話ではありません。クラスというカテゴリに関連する情報を表すことができる変数でなければなりません。
先程作成したFruitクラスであれば、果物に関する情報でなければならないということです。例えばですが、「name」「color」といったプロパティが必要かもしれません。
では追加してみましょう。
1 2 3 4 5 6 7 |
//Fruit2.php <?php class Fruit { public $name; public $color; } ?> |
プロパティとして変数と定義する際に気を付けないといけない点は通常の変数の定義と相違がある点です。
アクセス修飾子を頭につける必要があることです。
アクセス修飾子とは・・・
アクセス修飾子とは、その変数に対して「どこから」アクセスできるかを決めるキーワードになります。
クラスの外からアクセスしたい場合は、publicキーワードを指定しなければなりません。
実際にプロパティに値を設定してみましょう。
1 2 3 4 5 6 7 8 9 10 11 |
//dinner.php <?php require_once 'Fruit2.php'; $f = new Fruit(); $f->name = 'リンゴ'; $f->color = '赤色' print "<p>こちらの果物は{$f->name}で{$f->color}なのが特徴です。</p>"; //こちらの果物はリンゴで赤色なのが特徴です。 ?> |
メソッド
では、メソッドも追加しましょう。
メソッドとは、クラスで管理される値を処理するための関数です。こちらではFruitクラスにname/colorメソッドを追加してみましょう。
1 2 3 4 5 6 7 8 9 10 11 |
//Fruit3.php <?php class Fruit { public $name; public $color; public function show () { print "<p>こちらの果物は{$this->name}で{$this->color}なのが特徴です。</p>"; //こちらの果物はリンゴで赤色なのが特徴です。 ?> } ?> |
プロパティと同じで先頭にアクセス修飾子を指定しなければならない点に注意をしておいてください。
こちらでは、showメソッドの中の$thisというキーワードに注目してください。$thisはインスタンスメソッドの中でのみ使用できる特別な変数で、現在のインスタンスを指します。
$this->name
$thisはメソッドからプロパティを操作する場合に登場する変数ですので、覚えておきましょう
では、showメソッドを呼び出しましょう。
1 2 3 4 5 6 7 |
//dinner2.php require_once 'Fruit3.php' $f = new Fruit(); $f->name = 'リンゴ'; $f->color = '赤色'; $f->show(); |
コンストラクタ
クラスを利用する際にnew演算子によって最初に「インスタンス化」のタイミングで実行される特別なメソッドがコンストラクタです。
コンストラクタは__constructに固定されていて、自分で変更されません。
コンストラクタは、インスタンス化のタイミングで実行される性質上、プロパティの初期化やクラスの内部で利用するリソースの初期化を記述するのが一般的です。
具体例を見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//Fruit4.php <?php class Fruit { public $name; public $color; public function __construct(string $name, string $color) { $this->name = $name; $this->color = $color; } public function show() { print "<p>こちらの果物は{$this->name}で{$this->color}なのが特徴です。</p>"; } ?> |
引数$name,$colorの値をそれぞれ対応しているプロパティにセットしています。
ただ、コンストラクタはあくまでインスタンスを初期化するためのメソッドです。それ自体がインスタンスを返しません。
こちらのFruitクラスを実際にインスタンス化しているのは下記です。
1 2 3 4 5 6 |
//construct.php <?php require_once 'Fruit4.php'; $f = new Fruit('リンゴ','赤色'); $f->show(); |
実はここで指定された引数はコンストラクタに渡されていたのです。