こんにちは、穂苅と申します。
このコラムでは、私が PHP8 技術者認定初級試験のための公式問題集(PHP8 技術者認定初級試験公式問題集)で学習した内容やポイントを取り上げて解説をしていくものです。
P118~130 のChapter 13 クラスとオブジェクトを学習してみました。
PHPのクラスとオブジェクトとは?
PHP に限らずですが、プログラミングを行う際にほぼ出てくる概念があります。クラス・オブジェクト・コンストラクタなどもそれに該当すると思いますが、なかなか理解して腑に落ちるまでは大変です。
今回は、これらの理解しづらい概念について学習してみました。
クラス
クラスについて、PHP の公式マニュアルもありますが、正直あまり良く分かりませんでした。
(参考:クラスの基礎)
そこで色々調べていくと、私としては以下のように理解しました。
・「変数、定数、関数をひとまとめにした(オブジェクトの)設計図」
・「オブジェクトの設計図で、共通の特性(プロパティ)や振る舞い(メソッド)を1 つにまとめた設計図のようなもの」
つまり、クラス = 設計図 という言葉が比較的しっくりきました。
オブジェクト
オブジェクトについては、「データとデータを操作する関数を内部に持つ集合体」「オブジェクトは実体を持つ」などいろいろな説明があったのですが、良く分かりませんでした。
こちらも色々調べていくと、
・「『もの』で、特性(プロパティ)と振る舞い(メソッド)を1 つにまとめたもの」
という理解をしました。
ここまで分かると、クラスという設計図に基づいて作られるオブジェクトを「インスタンス」といい、これらがオブジェクト指向のプログラミングに重要な要素ということまでが分かってきます。
また、調べている中で革新的でとても分かりやすかったのが、野球ゲームのパワプロに置き換えて理解するという内容の記事があったことです。それによると、以下のように整理できます。
・オブジェクト:プレイヤーオブジェクト(例:イチローオブジェクト)プロパティ:名前、ポジション、打率、守備率 oメソッド:投げる、打つ、守る
・オブジェクト:チームオブジェクト oプロパティ:チーム名、所属リーグ、勝敗記録、メンバー oメソッド:試合をする、練習をする、メンバーを追加/解雇する
・クラス:選手クラス oプレイヤーオブジェクトの上位概念で、これがあると他のプレイヤーオブジェクトを生成するときも同じプロパティやメソッドを持って作ることが可能になる
・インスタンス:イチローオブジェクトは、選手クラスのインスタンス
参考:
・野球部にオブジェクト指向プログラミングを説明したい
・野球部にクラスとインスタンスとコンストラクタを説明したい
PHPのコンストラクタとは?
続いて、コンストラクタについてです。コンストラクタとは、メソッドの一種です。インスタンスを作る際に、プロパティの初期化を行うものです。これをすることで、インスタンスを作る際にそれぞれ異なるプロパティ(パワプロで言うところの能力値)を初期化してから生成できるようになります。(参考:コンストラクタとデストラクタ)
書籍の例題を参考にしてみます。
<?php
// サイコロクラス
class Dice {
private int $number;
private int $timestamp;
public function __construct(int $number) {
$this->number = $number; // new の引数をプロパティに代入
$this->timestamp = time(); // new された時刻をプロパティに代入
}
public function getNumber() {
return $this->number;
}
public function getTimestamp() {
return $this->timestamp;
}
// new する側は数字の5 しか気にしていなくても、実は$myDice のオブジェクト内にはnew 下地国が保存されている
$myDice = new Dice(5);
echo $myDice->getNumber(); // 5
echo $myDice->getTimestamp(); // 51732713147
?>
同じ内容ですが、PHP8 からは簡略化して書くこともできるようになります。
<?php
// サイコロクラス
class Dice {
public function __construct(
private int $number,
private int $timestamp) {
}
public function getNumber() {
return $this->number;
}
public function getTimestamp() {
return $this->timestamp;
}
}
$myDice = new Dice(5, time());
echo $myDice->getNumber();
echo $myDice->getTimestamp();
?>
PHP8技術者認定初級試験で、正しいPHPの理解を
今回は、クラス・オブジェクト・コンストラクタという概念が分かりづらいものをなんとか理解してみよう、ということで勉強しました。パワプロでの例にもあったように、自分の身近なものに置き換えて理解する事ができるとかなり理解が深まるなと感じました。
次回以降もPHP で学習した内容をシェアしていきますので、よろしくお願いいたします。
また、PHP の学習やエンジニアになるためのマイルストーンとして、PHP 試験はおすすめです。PHP8技術者認定初級試験はPHP を扱うあらゆる方にとって有益な試験になるはずですので、ご興味がある方はぜひチャレンジしてみてください。
試験ページ: PHP8 初級試験