第4章 コンストラクタ
4.2 コンストラクタの利用方法
コンストラクタの種類には2つあることは前節で学習しました。その2種類の利用方法について説明していきます。
コンストラクタの種類
① 引数なしのコンストラクタ
② 引数ありのコンストラクタ
書式:引数なしコンストラクタ書式
ポイントとして引数なしのコンストラクタはクラスブロック内に定義します。メソッドに似た形で定義しますが、定義する時は__constructという名前を使うことになっています。
凡例:引数なしコンストラクタ書式
凡例を見てもらうと分かるようにコンストラクタは、メソッドに非常に似ています。繰り返し説明になってしまいますが、コンストラクタの名前は必ず__constructという文字列であり、また戻り値を指定できないといった違いがあります。その他はアクセス修飾子も定義でき、引数の有無も自由に設定できる点はメソッドと同じになります。但しアクセス修飾子を「private」や「protected」にしてしまうと、外部クラスから利用してオブジェクト生成ができなくなるので、基本的には「public」で定義します。
そしてコンストラクタ内の処理は任意に記述できますが、フィールド変数の初期化を行うのが最も一般的です。
書式:引数ありコンストラクタ書式
基本的には引数なしのコンストラクタと同じですが、引数を設定するという点がポイントになります。引数設定はメソッドと同じように行えます。
凡例:引数ありコンストラクタ書式
引数ありのコンストラクタ設定ですが、コンストラクタ名の「()括弧」内に引数名を設定するだけになります。今回は引数を2つ持つコンストラクタを例に挙げていますが、もちろん1つでも3つ以上でも持たせることができます。
注意点としては、そのクラスに用意するコンストラクタは引数なしでも引数ありでも、用途に応じてどちらでもいいのですが、「1つのクラスにつき用意できるコンストラクタは1種類だけ」ということに注意してください。用途に応じて引数なしと引数ありを両方用意して使い分けることはできず、引数なしの場合は引数なしでのオブジェクト生成、引数ありの場合は定義されている数と同じ個数の情報を引数としてのオブジェクト生成しかできません。
ポイント・コンストラクタは引数なしや引数ありで記述することができる。
・1つのクラスにつき用意できるコンストラクタは1種類だけで、引数が異なるコンストラクタを複数定義することはできない。
次にどのようにしてコンストラクタを呼び分けるのか、その記述方法について説明していきます。
書式:コンストラクタ呼び出し
この書式は引数を指定して呼び出す場合がある以外は、これまで学習してきたオブジェクト化の方法と同じです。
コンストラクタはオブジェクトを生成すると自動で動作する処理なので、処理を呼び出すために明示的な宣言は必要ありません。
凡例:コンストラクタ呼び出し(数なしコンストラクタ)
本項のこれまでの凡例で紹介した「Computer1」クラスを例にします。
引数なしのコンストラクタは「new Computer1()」と記述することで呼び出せます。この呼び出し方はこれまで学習した、オブジェクトを生成する際の記述方法と同じになっています。
凡例:コンストラクタ呼び出し(引数ありコンストラクタ)
本項のこれまでの凡例で紹介した「Computer2」クラスを例にします。
引数ありのコンストラクタを呼び出す方法は、引数なしの呼び出し方に少し追加して「()括弧」の中に値を設定すれば呼び出せます。値を設定する方法はメソッドを呼び出す方法と同じです。
ポイント・クラス内に引数の数が一致するコンストラクタが定義されていれば、そのコンストラクタが呼び出される。
もしも引数の数が一致しない場合は、実行時エラーになる為、間違えないように注意が必要になる。
次の項より実際のソースコードでコンストラクタが動作するサンプルを紹介していきます。
4.2.1 引数なしのコンストラクタを利用したプログラム
オブジェクトを生成すると同時にコンストラクタが動作しているのことを確認し、さらにコンストラクタを利用しフィールド変数に初期値を設定します。引数なしコンストラクタの動きや利用方法について学習しましょう。
ソースコード
ソース・フォルダー :myproj_framework_basic/ch04
ファイル名 :constructor1.php
アクセスURL :http://localhost/myproj_framework_basic/ch04/constructor1.php
➢ constructor1.php
1: <?php // クラスの定義作成 class Computer1{ private $os; private $memory; // 引数なしコンストラクタ public function __construct(){ // フィールド変数に初期値を設定 $this->os = "未設定"; $this->memory = 0; echo "パソコンを作成しました。<br>"; } public function show(){ echo "パソコンのOSは「" . $this->os . "」です。<br>"; echo "メモリサイズは「" . $this->memory . "MByte」です。<br>"; } } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>引数なしコンストラクタ</title> </head> <body> <?php echo "--「引数なしコンストラクタ」の実行前--<br>"; $com = new Computer1(); echo "--「引数なしコンストラクタ」の実行後--<br>"; $com->show(); ?> </body> </html>
実行結果
解説
28~30行目でオブジェクトを生成したタイミングで、コンストラクタが動作することを確認しています。
実行結果のメッセージ出力タイミングを見ても分かるように、29行目でオブジェクトを生成するnew演算子の処理時にコンストラクタが動作しているのが確認できます。呼び出し元では__construct()メソッド自体の呼び出しは記述していないので、オブジェクトを生成すると自動でコンストラクタが動作していることも確認できます。
上記の処理の実行結果
31行目でフィールド変数の値の結果を画面に出力しています。
実行結果から分かるようにコンストラクタで設定した値が正しく表示されています。
上記の処理の実行結果
引数なしのコンストラクタの注意点
1)オブジェクト生成する時に、コンストラクタ定義と引数の有無を一致させる必要がある。
2)コンストラクタ定義と一致させない場合は、実行時エラーになる。
4.2.2 引数ありのコンストラクタを利用したプログラム
コンストラクタを利用しフィールド変数に任意の初期値を設定しているプログラムです。引数ありのコンストラクタを使ったフィールド変数の初期化について学習しましょう。
ソースコード
ソース・フォルダー :myproj_framework_basic/ch04
ファイル名 :constructor2.php
アクセスURL :http://localhost/myproj_framework_basic/ch04/constructor2.php
➢ constructor2.php
<?php // クラスの定義作成 class Computer2{ private $os; private $memory; // 引数ありコンストラクタ public function __construct($os, $memory){ // フィールド変数に初期値を設定 $this->os = $os; $this->memory = $memory; echo "OS「" . $os . "」メモリサイズ「" . $memory . "MByte」のパソコンを作成しました。<br>"; } public function show(){ echo "パソコンのOSは「" . $this->os . "」です。<br>"; echo "メモリサイズは「" . $this->memory . "MByte」です。<br>"; } } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>引数ありコンストラクタ</title> </head> <body> <?php echo "--「引数ありコンストラクタ」の実行前--<br>"; $com = new Computer2("WindowsXP", 2048); echo "--「引数ありコンストラクタ」の実行後--<br>"; $com->show(); ?> </body> </html>
実行結果
解説
29行目で引数値「WindowsXP、2048」を設定し、オブジェクトの生成を行っています。
上記の処理の実行結果
31行目でフィールド変数の値の結果を画面に出力しています。
実行結果から分かるようにコンストラクタの引数で設定した値が正しく表示されています。
上記の処理の実行結果
引数ありのコンストラクタの注意点
1)オブジェクト生成する時に、引数の数と型をコンストラクタ定義と一致させる必要がある。
2)コンストラクタ定義と一致させない場合は、実行時エラーになる。
コンストラクタは引数の数と型が一致するものを呼び出します。そのため、注意点については引数がある場合も、引数がない場合も全く同じになります。
4.2.3 private修飾子のコンストラクタを呼び出すプログラム
private修飾子がついたコンストラクタを持つクラスを外部から呼び出すプログラムです。アクセス修飾子によってコンストラクタのアクセス制限が行えることを確認しましょう。
ソースコード
ソース・フォルダー :myproj_framework_basic/ch04
ファイル名 :privateConstructor.php
アクセスURL :http://localhost/myproj_framework_basic/ch04/privateConstructor.php
➢ privateConstructor.php
<?php // クラスの定義作成 class Computer3{ private $os; private $memory; // privateのコンストラクタ private function __construct($os, $memory){ // フィールド変数に初期値を設定 $this->os = $os; $this->memory = $memory; echo "OS「" . $os . "」メモリサイズ「" . $memory . "MByte」のパソコンを作成しました。<br>"; } public function show(){ echo "パソコンのOSは「" . $this->os . "」です。<br>"; echo "メモリサイズは「" . $this->memory . "MByte」です。<br>"; } } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>privateのコンストラクタ</title> </head> <body> <?php echo "--newの前--<br>"; $com = new Computer3("WindowsXP", 2048); echo "--newの後--<br>"; $com->show(); ?> </body> </html>
実行結果
以下のような実行時エラーが出力されます。
解説
Computer3クラスで定義したコンストラクタのアクセス修飾子を「private」に設定しています。
29行目で引数値に「WindowsXP、2048」を与えてオブジェクト生成を行っていますが、コンストラクタがのアクセス修飾子がprivateになっている為、実行時エラーになります。
図 4.2.1:コンストラクタのアクセス制限
前章で学習したアクセス修飾子の仕組みが理解できていれば、なぜ実行時エラーになるか直ぐに分かると思います。「Computer3」クラスが外部からアクセス可能でも、そのクラスのコンストラクタ自体がアクセス制限されてしまっているとオブジェクトの生成ができなくなってしまいます。
オブジェクト生成とコンストラクタ処理が一連の動作として組み込まれているため、今回のサンプルのようにコンストラクタに「private修飾子」が設定されていると、コンストラクタにアクセスできなくなりオブジェクト生成が不可能なケースとなってしまいます。