おはようございます、こんにちは、こんばんわ。
フリーランスの薬剤師として生活収入を得ながら、プログラミング言語を勉強している”Yuya Matsuura”と申します。
その中で、【WordPress】などにも採用されている≪PHP≫について、改めて学び始めておりまして、
ブログ記事としてアウトプットすることで知識の定着を狙う
+同じような境遇の方の参考になればと思い、シリーズ化して記事にさせて頂きます。
個人的な目標は”Raravel”(フレームワーク)をサクサク使いこなせるようになりたい!です。
※なお、追々記事でまとめるかは決めかねていますが、ローカル環境構築については今のところ記事にするつもりはないので、ご容赦ください。
アウトプット方式なので、記事としては見難いかも知れませんが、ご参考になれば幸いです。
今回はPHPにおけるオブジェクト指向・クラスの2回目です。
ご参考になれば幸いです。
コンストラクタ関数で初期値を設定しよう!
コンストラクタと言う関数(メソッド)があります。
このメソッドを事前に記述しておくことで、インスタンスを作る際に同時に「初期化」を行うことが出来ます。
習うより慣れろですね!
実際にコードを書いてみましょう。
まず復習です。
【バックエンド初心者がまとめるPHP学習日記⑧】クラスと言う概念を理解しよう!その①
<?php
class Member {
public $name;
}
$kimura = new Member();
$kimura->name = '木村';
echo $kimura->name;
?>
その①で記述した、プロパティのクラス内格納例です。
1⃣ この書き方は、Memberと言うクラスの中にプロパティ「name」を格納する
2⃣ new Memberでインスタンス化し、「kimura」と言う変数に格納する
3⃣ インスタンス「kimura」から「-> name」でプロパティにアクセスし、「’木村’」と文字列を代入する
4⃣ echo文で「name」を呼び出す
と言う順を踏んで、結果的にブラウザには「木村」と言う文字が出力されました。
↑の通りです。
お気づきの方は、このまどろっこしさかが分かると思うのですが、
new Member() でインスタンス化したものは、まだプロパティ「name」に値が代入されていないため、
インスタンス化するたびに全く同じ【インスタンス】が作成されることになります。
<?php
class Member {
public $name;
}
$kimura = new Member();
$nakai = new Member();
$inagaki = new Member();
$kusanagi = new Member();
$katori = new Member();
$kimura->name = '木村';
$nakai->name = '中居';
$inagaki->name = '稲垣';
$kusanagi->name = '草彅';
$katori->name = '香取';
echo $kimura->name;
echo $nakai->name;
echo $inagaki->name;
echo $kusanagi->name;
echo $katori->name;
?>
全く同じインスタンスを5つ作って、それぞれに値を代入しているのですが、
この記述ってとても長くなってしまいますし、面倒ですよね・・・、、、
という事で、ここでコンストラクタ関数を使います。
関数なので、メソッドの記述方法でクラス内に書いていきます。
class Member {
public $name;
public function __construct(string $name) {
$this->name = $name;
}
}
$kimura = new Member('木村');
$nakai = new Member('中居');
$inagaki = new Member('稲垣');
$kusanagi = new Member('草彅');
$katori = new Member('香取');
echo $kimura->name;
echo $nakai->name;
echo $inagaki->name;
echo $kusanagi->name;
echo $katori->name;
?>
出力結果は同じですが、コードはスッキリしたかと思います。
public $name;
public function __construct(string $name) {
$this->name = $name;
}
この3行目からの記述部分がコンストラクタ関数になります。
メソッド(関数)なのでpublic(またはprivate)に続いて「function」と記述します。
その後に、「 _ 」(アンダーバー)を2つ続けて、construct()と書きましょう。
メソッドなので () の中には引数が入って、関数内に渡っていきます。
オレンジ色のnameは「this」を使ってアクセスした、クラス内のプロパティ「name」です。
青色のnameは渡ってきた変数「name」です。
このようにコンストラクタ関数を記述することで、渡す変数をプロパティに「初期値」として設定することが出来ます。
あとは、変数の値を「どこに入力するのか」と言うと、インスタンス化の際の【new クラス名( )】の ( ) になります。
このように事前にコンストラクタ関数を設定することで、異なるプロパティを持ったインスタンスを簡単に作ることが出来るようになりました。
コンストラクタ関数の引数は複数渡すことが出来ます!
渡す変数が1つだと恩恵を感じにくいかも知れませんが、もちろん複数渡すことも出来ます。
<?php
class Car {
public $name;
public $color;
public $transmission;
public function __construct(string $name, string $color, string $transmission) {
$this->name = $name;
$this->color = $color;
$this->transmission = $transmission;
}
}
$car1 = new Car('フェラーリ', '赤', 'MT');
$car2 = new Car('タント', '緑', 'AT');
$car3 = new Car('タント', '白', 'AT');
$car4 = new Car('プリウス', '白', 'AT');
echo $car1->name;
echo '<br>';
print_r($car1);
echo '<br>';
print_r($car2);
echo '<br>';
print_r($car3);
echo '<br>';
print_r($car4);
?>
事前にコンストラクタ関数を記述しておくことで、インスタンス化の際に各引数を変えるだけで、
異なる性質を持ったcar1~car4のインスタンスを作成することが出来ました。
ちなみに確認のために呼び出しているecho文の他にも、ブラウザに表示させる方法がいくつかあります。
その中の1つに【print_r】関数があります。
print_r( 変数名)で各プロパティ毎では無く、まとめてオブジェクトの中身を呼び出すことが出来ます。
色々と項目を変えてみて、出力結果を試してみてください!
まとめ
以上、2回にわたりPHPにおけるオブジェクト指向・クラスの考え方について説明してみました。
関数もそうですし、クラスもそうなのですが、とても理解するのは一苦労する概念だと思うのですが、
結果的に使いこなせれば全体のコード量を短くしたり、他の方がそのコードを見た時の可読性のUPに繋がったりします。
私が並行して学んでいるJavaScript(React)もクラスに関しては概ね同じ記述方法と考え方を持っています。
他の言語(JavvaやPython)もオブジェクト指向は必須と伺っていますので、
理解できるまで何度もコードを書いて学習していきましょう!
コメント